将负整数强制转换为更大的无符号整数

Casting negative integer to larger unsigned integer

本文关键字:无符号整数 转换 整数      更新时间:2023-10-16

我遇到了执行以下转换的代码:

static_cast<unsigned long>(-1)

据我所知,C++标准定义了将有符号整数值转换为无符号整数类型时会发生什么(请参阅:如果将负值赋给无符号变量会发生什么?)。

我在上面的代码中担心的是,源类型和目标类型的大小可能不同,以及这是否会对结果产生影响。编译器会在强制转换之前放大源值类型吗?它会转换为相同大小的无符号整数,然后放大吗?或者其他什么?

为了用代码澄清,

int nInt = -1;
long nLong = -1; // assume sizeof(long) > sizeof(int)
unsigned long res1 = static_cast<unsigned long>(nInt)
unsigned long res2 = static_cast<unsigned long>(nLong);
assert(res1 == res2); // ???

基本上,我应该担心写这样的代码吗

static_cast<unsigned long>(-1L)

超过

static_cast<unsigned long>(-1)

根据C++11标准,4.7"积分转换",第2段:

如果目标类型是无符号的,则结果值最小与源整数全等的无符号整数(模2n,其中n是用于表示无符号类型的位数)。

换句话说,当转换为无符号整数时,只有输入的值才重要,而不是它的类型。将-1转换为n位无符号整数将始终为2n-1,无论-1以哪种整数类型开始。

这是一个很好的问题,本节的C++标准草案4.7积分转换说:

如果目标类型是无符号的,则得到的值是与源整数全等的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。[…]

不是最直接的解释,在这种情况下,我会回到C99标准草案,它说:

否则,如果新类型是无符号的,则通过重复添加或比新类型中可以表示的最大值多减去一直到该值在新类型的范围内49

其中脚注49有助于说明:

规则描述的是数学值的算术运算,而不是给定类型表达式的值。

这更直接,并且清楚地将结果作为-1 + MAX + 1,即MAX,而不管操作数是什么类型。