[英]C Convert a Short Int to Unsigned Short
C中的short int包含16位,第一位表示該值是負還是正。 我有一個C程序如下:
int main() {
short int v;
unsigned short int uv;
v = -20000;
uv = v;
printf("\nuv = %hu\n", uv);
return 0;
}
由於v的值是負的,我知道變量的第一位是1.所以我希望程序的輸出等於uv = 52,768 b / c 20,000 +(2 ^ 15)= 52,768 。
相反,我得到uv = 45536作為輸出。 我邏輯的哪一部分不正確?
您看到的行為可以通過C的轉換規則來解釋:
6.3.1.3有符號和無符號整數
1當具有整數類型的值轉換為除
_Bool
之外的另一個整數類型時,如果該值可以由新類型表示,則它將保持不變。2否則,如果新類型是無符號的,則通過重復加或減一個可以在新類型中表示的最大值來轉換該值,直到該值在新類型的范圍內。
(此報價來自C99。)
-20000
不能用unsigned short
表示,因為它是負數。 目標類型是無符號的,因此通過重復添加65536( USHORT_MAX + 1
)來轉換該值,直到它在范圍內: -20000 + 65536
正好是45536
。
請注意,此行為是由C標准強制執行的,與負數在內存中的實際表示方式無關(特別是,即使在使用符號/幅度或補碼的機器上,它的工作方式也相同)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.