[英]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
我不明白從有signed
為unsigned
時int
和char
什么區別?
你能開導我嗎?
從有符號轉換為無符號時,它們的行為相同。 表現不同的是==
比較。 對於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.