繁体   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