[英]unsigned char output of a signed char
我有以下代碼:
char x = -1;
int y = x;
printf("%u\n", x);
printf("%u\n", y);
輸出為:
4294967295
4294967295
我不明白為什么x可以得到這樣的值。 我知道一個無符號字符的最大值是255,而一個有符號字符的最大值是127。怎么可能是4294967295?
對於使用可變參數的printf
類的printf
,任何小於int
整數類型( char
和short
)都隱式提升為int
。 浮點數也是如此, float
被提升為double
。
因此,您的char
被符號擴展為值-1
的int
,並且由於您將其打印為無符號,因此以2的補碼形式得到UINT_MAX
。
編輯:如下所示,如果您的char
默認為unsigned(取決於您的編譯器/平台),答案將改為255
。 升級時,該值將被零擴展而不是符號擴展。
該變量的值為-1。 但您在printf中指定了%u(unsigned int)
int是32位,因此2 ^ 32 = 4294967296 => -1 + 4294967296 = 4294967295希望您理解這一點。
您正在濫用格式說明符並因此而導致未定義的行為。我的理解是,在每種情況下,轉換成其二進制補碼二進制表示形式的數量對於-1或4294967295都是相同的。這就是為什么%u用於簽名打印4294967295通過忽略-ve最左邊的位。 當%d用於帶符號的int時,它將最左邊的位用作-ve標志並打印-1。 類似地,%u表示無符號,但會打印無符號值,但%d使它將數字視為有符號,因此打印-1
如果輸入限定符是帶signed
,請注意符號位,如果符號位為1,則將得到負值。 盡管x
是帶signed char
,但是您期望使用1 byte
值,但是由於符號位復制機制,您會獲得4 byte
值。
x值:
x = -1 = 0000 0000 0000 0000 0000 0000 1111 1111
|
sign bit, this bit get's copied into remaining bytes, so it becomes like
= 1111 1111 1111 1111 1111 11111 1111 1111 => calculates this => 4294967295
= |
sign bit , now you are printing in %u format i.e unsigned so it will ignore signed bit and you are getting big value.
如果以%d
或%i
格式打印,則相同
printf("%d\n", x); // it prints -1 bcz %d will check sign bit which is 1 i.e it will prints -ve value, so it's prints -1
我只是試圖解釋為什么會得到這樣的輸出,但是如果您沒有使用正確的格式說明符,這就是某些注釋中提到的undefined behaviour
。 您可以參考不同的C標准。
編輯:證明我的觀點(Linux機器),讓我們考慮以下代碼
int main()
{
unsigned char x = -1;
printf("%u\n",x);
/*In above printf input is unsigned, so compiler won't
check sign bit, even though sign bit is 1, result
will be +ve only. */
printf("%d\n",x);//some of you may expects -1 because of %d, it's wrong.
/* In above printf it's printing 255 not because of format
specifier, it's because of your input qualifier(which is
unsigned in this case) */
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.