簡體   English   中英

無符號字符的無符號字符輸出

[英]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整數類型( charshort )都隱式提升為int 浮點數也是如此, float被提升為double

因此,您的char被符號擴展為值-1int ,並且由於您將其打印為無符號,因此以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM