簡體   English   中英

C如何將帶符號的十六進制數轉換為負數?

[英]How does C convert signed hex number to negative numbers?

所以最近,我遇到了這個問題:

給定:int x; 無符號整數y; x = 0xAB78; y = 0xAB78; 編寫程序以在屏幕上顯示x和y的十進制值。

這是我編寫的程序:(我在64位Windows 7計算機上)

#include<stdio.h>
#include<math.h>

int main()
{
    short int x;
    unsigned short int y;
    x = 0xAB78;
    y = 0xAB78;
    printf("The decimal values of x and y are: %d & %hu.\n", x, y);
    return 0;
}

我得到的輸出是:x = -21640和y = 43896。

我可以使用無符號十六進制數字,因為0xAB78 = 10 * 16 ^ 3 + 11 * 16 ^ 2 + 7 * 16 ^ 1 + 8 * 16 ^ 0 = 43896。

但是,對於帶符號的十六進制數,它應該是:-1 * 16 ^ 3 + 11 * 16 ^ 2 + 7 * 16 ^ 1 + 8 * 16 ^ 0 = -1160嗎? 為什么是-21640呢?

感謝您的時間!

如果常量不適合您的帶符號整數類型,則結果是實現定義的。

C允許帶符號的數字為1補碼,符號和大小和2補碼。 另外, short最小寬度為16個值位,並且可以包含非值位。 陷阱表示也是可能的。

這給出了很多可能的結果。

對於POSIX和Windows機器,必須使用16位2s補碼,因此只需減少2 ** 16的常數模。 如果> = 2 ** 15,則減去2 ** 16。

signed short int范圍值是[-32768 ; 32767] [-32768 ; 32767] 0xAB78 (或43896 ),將不適合,所以它溢出到-32768 + (43896 - 32768)從而結束-21640

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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