簡體   English   中英

在C ++中有符號和無符號之間的轉換

[英]conversion between signed and unsigned in C++

考慮以下C ++代碼:

#include <cstdio>

using namespace std;

int main()
{
    int ia = -5;
    unsigned int uia = ia;
    char ca = -5;
    unsigned char uca = ca;

    printf("%d\n", (ia == uia));
    printf("%d\n", (ca == uca));

    return 0;
}

輸出是

1
0

我不明白從有signedunsignedintchar什么區別?

你能開導我嗎?

從有符號轉換為無符號時,它們的行為相同。 表現不同的是==比較。 對於int / unsigned,它的行為符合預期,但是當您比較兩個較小的類型時,它們都會先被提升為int 因此發生的是,-5和-5的無符號8位表示形式都被提升為int ,然后進行比較。 這些明顯不同,無法通過比較。

好的,這種不一致行為的實際原因是char和unsigned的潛在提升。 我想更具體地解釋一下。

首先,當compaire具有int和unsigned int變量時,它們的類型無關緊要,因為無論它們是什么類型,它們在內存中都具有相同的二進制表示形式,這就是==運算符所關心的。

而當==應用於char和unsigned char varialbes時,它們將首先擴展為相應的32位整數類型,並且如何使其膨脹是不一致的關鍵。 由於ca是一個字符,因此它將用符號位(通過MOVSX)擴展,而uca僅用填充0(通過MOVZX)擴展。 因此,它們現在具有不穩定的二進制表示形式。

匯編代碼說明了這個事實。

    int b1 = ia == uia;
000613E5  mov         eax,dword ptr [ia]  
000613E8  xor         ecx,ecx  
000613EA  cmp         eax,dword ptr [uia]  
000613ED  sete        cl  
000613F0  mov         dword ptr [b1],ecx  
    int b2 = ca == uca;
000613F3  movsx       eax,byte ptr [ca]  
000613F7  movzx       ecx,byte ptr [uca]  
000613FB  xor         edx,edx  
000613FD  cmp         eax,ecx  
000613FF  sete        dl  
00061402  mov         dword ptr [b2],edx 

帶符號的類型既可以是負數也可以是正數。 而無符號的則較高,但不能為負。

因此,無符號int的最大值分別為4,294,967,296。 其最小值為0。

而有符號整數的范圍是-2,147,483,648至2,147,483,648。

我希望這可以幫助您了解有符號和無符號類型之間的區別。

當您要避免值為負數時,此功能會派上用場。 例如對數組的引用 或者如果您只需要正大數值而沒有負數。 節省您的時間。

暫無
暫無

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

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