[英]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.