LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 236|回复: 0

有符号到无符号的转换

[复制链接]
发表于 2024-1-28 23:38:10 | 显示全部楼层 |阅读模式
有符号整型及其对应的无符号整型的大小总是相同,但它们的区别在于为值转换解释位模式的方式。 以下代码示例演示将相同的位模式解释为有符号值和无符号值时发生的情况。 存储在 num 和 num2 中的位模式将与前面的演示中所示的位模式保持相同,绝不会发生更改。

C++

using namespace std;
unsigned short num = numeric_limits<unsigned short>::max(); // #include <limits>
short num2 = num;
cout << "unsigned val = " << num << " signed val = " << num2 << endl;
// Prints: "unsigned val = 65535 signed val = -1"

// Go the other way.
num2 = -1;
num = num2;
cout << "unsigned val = " << num << " signed val = " << num2 << endl;
// Prints: "unsigned val = 65535 signed val = -1"
请注意,值将在两个方向重新解释。 如果程序生成了奇怪的结果,其中的值的符号似乎与您预期的相反,请查找有符号和无符号整型之间的隐式转换。 在以下示例中,当表达式的结果 (0 - 1) 存储在 num 中时,该结果将从 int 隐式转换为 unsigned int。 这将导致位模式被重新解释。

C++

unsigned int u3 = 0 - 1;
cout << u3 << endl; // prints 4294967295
编译器不会发出有关有符号和无符号整型之间的隐式转换的警告。 因此,建议完全避免有从符号到无符号的转换。 如果无法避免它们,则添加运行时检查,以检测所转换的值是大于或等于零还是小于或等于有符号类型的最大值。 此范围内的值将从有符号转换为无符号或从无符号转换为有符号而不用重新解释。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表