1、符號也是數字的一部分,也要在內存中體現出來。符號只是正負兩種情況,用一位(Bit)就足以表示;C語言中規定,把內存的最高位作為符號位。
2、C語言中規定,在符號位中,用0表示正數、用1表示負數。
3、C語言允許我們這樣做,如果不希望設置符號位,可以在數據類型前面加上unsigned關鍵字,
例如:unsigned int b=1002;或 unsigned b=1002;
這樣,short、int、long中就沒有符號位了,所有的位都用來表示數值,正數的取值范圍更大了,這也意味着,使用了unsigned后只能表示正數,不能在表示負數了!加了unsigned的數字稱為無符號數未加的數字稱為有符號數!
printf不支持以八進制(%0)和十六進制(%x)形式輸出有符號數,只有十進制用%d來表示有符號數。用%u來表示無符號數。
4、工作原則:
1)當以有符號數的形式輸出時,printf會讀取數字所占的內存,並把最高位作為符號位,把剩下的內存作為數值位。
2)當以無符號數的形式輸出時,printf也會讀取數字所占的內存,並把所有內存都作為數值位對待。
對於一個有符號的正數,它的符號位是0;當按照無符號數的形式讀取時,符號位就變成了數值位,但該位恰巧是0而不是1;所以對數值不會產生影響,這就好比在一個數字前面加0,有多少個0都不會影響數字的值。
可以說,“有符號的正數的最高位是0”這個巧合才使得%0和%x輸出有符號數時才不會出錯!
5、注意:雖然部分編譯器支持二進制數字的表示,但是卻不能使用printf函數輸出二進制,這一點比較遺憾!
若要使輸出的八進制或十六進制的前綴也輸出,則要在%前加上 # 號。例如:%#0、%#x
6、小數的輸出:
%e以指數形式輸出float類型,輸出結果中的e小寫。
%le以指數形式輸出double類型,輸出結果中的e小寫。
1)%g默認最多保留六位有效數字,包括整數部分和小數部分;%f和%e默認保留六位小數,只包括小數部分。
2)%g不會再最后強加0來湊夠有效數字的位數,而%f和%e會在最后強加0來湊足小數部分的位數
7、數字的默認類型:對於整數,默認為int類型;對於小數,默認是double類型。
1)在整數后面緊跟l或者L(不區分大小寫)表明該數字是long類型
2)在小數后面緊跟f或F表明數字是float類型
8、小數和整數之間的相互賦值:
1)將整數賦值給小數類型,在小數后面加0就可以了,加幾個都無所謂哦!
2)將小數賦值給整數類型,就得把小數部分丟掉,只能取整數部分,這會改變數字本身的值。直接丟掉小數部分,不是進行四舍五入!
由於將小數賦值給整數類型會“失真”,所以編譯器一般會給出警告,讓大家引起注意。