1. 程式人生 > >關於unsigned char、unsigned short使用printf(“%d”)進行輸出的結果

關於unsigned char、unsigned short使用printf(“%d”)進行輸出的結果

對於unsigned 無符號資料型別是不應該向其賦值負數的,但是如果賦值了那會怎麼樣呢?

#include <stdio.h>
#include <stdlib.h>
int main()
{
	unsigned char uc= -1;
	unsigned short us=-1;
	unsigned int ui= -1;
	printf("uc=%d\n",uc);
	printf("us=%d\n",us);
	printf("ui=%d\n",ui);
	system("pause");
	return 0;
}

執行結果如下:


產生這種結果的原因是什麼?uc和us在使用printf函式進行輸出時都會進行型別提升,補足為4位元組的int 型別(這麼說可能不嚴謹,反正就是提升為4位元組),由於uc和us都是無符號型別,所以提升的時候前面都是補0。也就是說us在記憶體中的儲存形式是0x0000ffff,uc在記憶體中是0x000000ff,而ui在記憶體中是0xffffffff,printf函式輸出什麼值是和前面的資料型別符相關的,例如上面那段程式中的printf是%d,那麼編譯程式就按照有符號整數來對後面的變數進行解釋。

相同賦值的int和usigned int在記憶體中的表示是一樣的,signed和unsigned只是告訴程式對記憶體的不同解釋方式,前者按照有符號數解釋(考慮符號位),後者按無符號數(不考慮符號位)解釋,這一點和%d,%u的作用是一樣的。

%d,%u的不同就在於對記憶體的解釋不同,前者將記憶體中的資料看成有符號的,後者看成是無符號的。(將signed int使用%u輸出,實質就是相當於對這塊記憶體的重新解釋)。變數的輸出與變數是unsigned還是unsigned無關,而取決於%d或u%等對記憶體的再解釋

有符號型別(char)無論向有符號型別(int)還是無符號型別(unsigned int)擴充套件,都會按照有符號數的擴充套件規則(高位補符號位)。
無符號型別(unsigned char)無論向有符號型別(int)還是無符號型別(unsigned int)擴充套件,都會按照無符號數的擴充套件規則(高位補0)。


補充一張圖,確實發生了型別提升