c++中有符号和无符号之间的转换

conversion between signed and unsigned in C++

本文关键字:之间 转换 无符号 符号 c++      更新时间:2023-10-16

考虑以下c++代码:

#include <cstdio>
using namespace std;
int main()
{
    int ia = -5;
    unsigned int uia = ia;
    char ca = -5;
    unsigned char uca = ca;
    printf("%dn", (ia == uia));
    printf("%dn", (ca == uca));
    return 0;
}

输出为

1
0

我不明白从signed铸造到unsigned时,intchar有什么区别?

你能给我点化一下吗?

当从有符号转换为无符号时,它们的行为相同。行为不同的是==比较。它的行为与int/unsigned的预期一致,但是当您比较两个较小的类型时,它们都首先被提升为int。所以发生的是-5和-5的无符号8位表示都被提升为int,然后进行比较。

好的,这种不一致行为的实际原因是char和unsigned的底层提升。我想更具体地解释一下。

首先,当与int型和无符号int型变量比较时,它们的类型无关紧要,因为无论它们是什么类型,它们在内存中都具有相同的二进制表示,这就是==运算符所关心的。

然而,当==应用于char和unsigned char变量时,它们首先会扩展为相应的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 

有符号类型可以是负数也可以是正数。而无符号的价值更高,但不能为负。

所以unsigned int的最大值分别是4,294,967,296。它的最小值是0。

,而signed int的取值范围是-2,147,483,648到2,147,483,648。

我希望这能帮助你理解有符号和无符号类型之间的区别。

当您想要避免一个值为负时,

这个特性会派上用场。例如对数组的引用。或者如果你只需要正值而不需要负值。为了避免你需要使用长。