uint 之间的差异可以为负数

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)

jus*_*bie 9

因为整数提升。

隐式转换中:

  1. 否则,两个操作数都是整数。两个操作数都经历整数提升(见下文);那么,在整数提升之后,适用以下情况之一:

无符号类型的转换等级低于有符号类型:如果有符号类型可以表示无符号类型的所有值,则无符号类型的操作数将隐式转换为有符号类型。

由于所有uint16_t值都可以表示为 an int(32 位),因此它被提升为int. 因为6 - 7 = -1,条件是false


值得注意的是,如果 C++ 编译器决定使用 16 位作为int,则这种情况不再成立。因为并非所有uint16_t值都可以保存在 16 位中int,所以它不再得到提升。6 - 7现在引起环绕,并成为true

  • 适用于使用 32 位“int”的编译器,即您作为初学者可能遇到的所有编译器。然而,C++ 编译器只能使用 16 位的“int”,如果是这种情况,“uint16_t”值的类型将是“unsigned int”,结果则相反。+1。 (3认同)