Sim*_*ice 5 c++ unsigned-integer
我有一个关于 C/C++ 中无符号整数的问题。它们以及对它们的运算结果应始终为正或等于零,但与 uint16_t 的差异看起来并非如此。uint 在 C++ 头文件 cstdint 中定义。
下一个程序采用“错误”分支:
uint16_t beg = 7;
uint16_t end = 6;
uint16_t zero = 0;
if (end - beg >= zero) cout << "This branch is always taken.\n";
else cout << "This branch will never be taken.\n";
Run Code Online (Sandbox Code Playgroud)
我在我的计算机(gcc 9.3.0)和编译器资源管理器上进行了测试,结果相同。
为了解决这个问题,我必须将差异转换为 uint16_t:
if (uint16_t(end - beg) >= zero) cout << "This branch is always taken.\n";
else cout << "This branch will never be taken.\n";
Run Code Online (Sandbox Code Playgroud)
因为整数提升。
在隐式转换中:
- 否则,两个操作数都是整数。两个操作数都经历整数提升(见下文);那么,在整数提升之后,适用以下情况之一:
无符号类型的转换等级低于有符号类型:如果有符号类型可以表示无符号类型的所有值,则无符号类型的操作数将隐式转换为有符号类型。
由于所有uint16_t值都可以表示为 an int(32 位),因此它被提升为int. 因为6 - 7 = -1,条件是false
值得注意的是,如果 C++ 编译器决定使用 16 位作为int,则这种情况不再成立。因为并非所有uint16_t值都可以保存在 16 位中int,所以它不再得到提升。6 - 7现在引起环绕,并成为true