6

考虑以下 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

我不明白int和之间的char区别signedunsigned什么?

你能启发我吗?

4

3 回答 3

7

从有符号转换为无符号时,它们的行为相同。不同之处在于==比较。对于 int/unsigned,它的行为与预期的一样,但是当您比较两个较小的类型时,它们都会被提升为int第一个。所以发生的事情是 -5 和 -5 的无符号 8 位表示都被提升为int然后进行比较。这些显然是不同的,无法进行比较。

于 2013-04-14T03:58:35.583 回答
1

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

首先,当与 int 和 unsigned 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 
于 2013-04-14T06:43:12.230 回答
-3

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

因此,无符号整数的最大值分别为 4,294,967,296。其最小值为 0。

而有符号整数的范围是 -2,147,483,648 到 2,147,483,648。

我希望这可以帮助您了解有符号和无符号类型之间的区别。

当您想避免值为负时,此功能可以派上用场。例如对数组的引用。或者,如果您只需要大的正值而不需要负值。为了节省你需要去很长时间。

于 2013-04-14T03:54:25.050 回答