【发布时间】:2019-04-10 09:26:35
【问题描述】:
根据here和here讨论的有符号和无符号整数类型之间隐式转换的规则,当将unsigned int与int相加时,带符号的int首先转换为@987654326 @。
考虑,例如,以下最小程序
#include <iostream>
int main()
{
unsigned int n = 2;
int x = -1;
std::cout << n + x << std::endl;
return 0;
}
尽管如此,程序的输出是 1,正如预期的那样:x 首先转换为 unsigned int,然后与 n 相加会导致整数溢出,从而给出“正确”答案。
在类似上一个的代码中,如果我确定n + x 是正数,我可以假设unsigned int n 和int x 的总和给出预期值吗?
【问题讨论】:
-
您是否在编译时启用所有警告?
-
@JGroven 这将如何影响答案?
-
嗯,可能、会等等都是不保证。编译器可能会警告可能的问题这一事实并不意味着,给定一个特定的标准,例如“如果我确定
n + x是肯定的”,它会,甚至它可能失败 -
@JGroven "如果编译器警告你正在做的事情,你可能不应该这样做。"呃,这是一个“警告”是有原因的——提醒你注意,以防万一。我遇到过很多情况,我在生产代码中的
WARNING: Unused variable X实际上很好(可能是因为声明本身就产生了影响,或者编译器只是错误)。 -
这将由实现定义。该标准表示有符号和无符号的位模式将相同,但不能保证 2 的补码。因此,如果这行得通,它将由实现定义。我相信
std::int8/16/32_t保证是 2 的补码,所以它们总是可以工作的。
标签: c++