[英]Printf in unsigned short int and unsigned int using %d
為什么在使用 %d 時在第二個 printf 中我沒有得到 -1?
#include<stdio.h>
int main(){
unsigned int u=-1;
unsigned short int y=-1;
printf("%d %u\n",u,u);
printf("%d %u",y,y);
}
假設int
是 32 位, short
是 16 位,並且體系結構使用二進制補碼:當您設置y=-1
,從有符號到無符號的轉換產生65535
。 當y
傳遞給printf
它被提升回int
,但這次值65535
是可表示的,因此printf
將打印65535
。
變量u
被聲明為具有unsigned int
類型。
unsigned int u=-1;
因此,您不能將轉換說明符%d
與此變量一起使用,因為u
的值無法在int
類型的對象中表示。 您必須使用轉換說明符%u
。
至於您的問題,那么變量y
的類型為unsigned short
並且在將整數提升為int
類型后,其值作為無符號值可以表示為int
類型的對象。 所以輸出正值。
在本聲明中
unsigned short int y=-1;
整數常量-1
被轉換為unsigned short
類型,如果您的編譯器支持整數的 2 的補碼表示,則轉換后的值表示正值 USHRT_MAX。
因為您已將y
定義為unsigned short
。 因為-1
絕對是一個有符號整數,所以編譯器不會將它作為-1
存儲到 y 中,而是將它存儲為65535
,這是-1
的溢出結果。 即無符號短范圍65536
-
1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.