簡體   English   中英

C將短Int轉換為無符號短

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

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