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("%dn", (ia == uia));
printf("%dn", (ca == uca));
return 0;
}
输出为
1
0
我不明白从signed
铸造到unsigned
时,int
和char
有什么区别?
你能给我点化一下吗?
当从有符号转换为无符号时,它们的行为相同。行为不同的是==
比较。它的行为与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。
我希望这能帮助你理解有符号和无符号类型之间的区别。
当您想要避免一个值为负时,这个特性会派上用场。例如对数组的引用。或者如果你只需要正值而不需要负值。为了避免你需要使用长。
相关文章:
- 在 Rcpp 中的字符串类型之间转换时出错
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- 在不同类型之间转换常量指针
- 在 3D 骨架系统 DirectX 之间转换
- C++ 如何将用户控件添加到窗体,以便我可以在面板之间转换
- 在 std::u8string 和 std::string 之间转换
- 如何在Unicode/UCS CodePoint和UTF16替代对之间转换
- 在DXGI格式之间转换RGBA数据
- 在两个不动点表达之间转换
- 在函数指针类型之间转换
- 代码的错误答案是在Java Camel案件和C 下划线标识符之间转换的错误答案
- 如何在C 中的不同类之间转换
- 一个关于C++中double和int之间转换的奇怪结果
- 模板类在模板类型之间转换,但也专门化
- 是否有Visual c++编译器在线,以及如何在c++和vs简单代码之间转换
- c/在Unix时间和"Gregorian time"之间转换
- 无法使用iconv在编码之间转换
- 在std::string和std::wstring之间转换的多平台方式
- 我真的应该每次在基元类型之间转换时都使用static_cast吗
- 使用Boost::units在两个量之间转换的最简单方法