鍍金池/ 問答/C  網(wǎng)絡(luò)安全/ -10用16進(jìn)制輸出為何為ffffff6

-10用16進(jìn)制輸出為何為ffffff6

#include <stdio.h>
int main()
{
    short int x = -10;
    // 原碼 - 1000 0000 0000 1010
    // 反碼 - 1111 1111 1111 0101
    // 補(bǔ)碼 - 1111 1111 1111 0110
    //         F    F    F    6(我以為的結(jié)果)
    // 結(jié)果 - fffffff6, 好像占用4個字節(jié)
    printf("%x\n", x);
}

剛開始看C語言,不太明白
求解,謝謝諸位

回答
編輯回答
帥到炸

printf("%x", n) 的打印結(jié)果 ff ff ff f6,去判定參數(shù) n 的長度為 4 字節(jié),是錯誤的。

根據(jù) C 語言規(guī)范,printf 函數(shù)的 x 修飾符在沒有指定長度時,默認(rèn)轉(zhuǎn)換成 unsigned int 類型。
即在本例中 printf("%x", n) 等同于 printf("%x", (unsigned int)n) 。

要將參數(shù) n 按原數(shù)據(jù)類型打印,可以這樣

printf("%hx", n);
// 或
printf("%x", (unsigned short)n);

參考
[1] C printf, http://www.cplusplus.com/refe...

2017年9月19日 06:30
編輯回答
我不懂

語言標(biāo)準(zhǔn)只規(guī)定了類型至少幾個字節(jié),以及幾種類型之間的大小關(guān)系。
類型具體占多大由編譯器決定。


李毅的回答是對的。你沒用正確的%x修飾符輸出,導(dǎo)致其實(shí)是按unsigned int輸出的。
如果你改對了輸出的修飾符之后,結(jié)果還是不符合預(yù)期,則可以用我上面的回答解釋。

2017年2月15日 10:32
編輯回答
耍太極
#include <stdio.h>

int main(void) { 
    
    char a=-10,b=1,e=2,d=4;
    long long c=-10;
    int sizea=sizeof(a);
    int sizec=sizeof(c);
    printf("%x,%d\n%x,%d\n",a,sizea,c,sizec);
    printf("%x,%d\n%x,%d",*((unsigned int*)&a),sizea,*((unsigned int*)&c),sizec);
    return 0;
}
2018年6月27日 18:09