将负整数转换为较大的无符号整数

Tho*_*ing 11 c++ size casting

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

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); // ???
Run Code Online (Sandbox Code Playgroud)

基本上,我应该担心像编写代码一样

static_cast<unsigned long>(-1L)
Run Code Online (Sandbox Code Playgroud)

过度

static_cast<unsigned long>(-1)
Run Code Online (Sandbox Code Playgroud)

Ros*_*ith 14

从C++ 11标准,4.7"整体转换",第2段:

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

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

  • 它使用了全等的数学定义:如果两个数字在除以 N 时都留下相同的余数,则它们是模 N 全等的。 (2认同)

Sha*_*our 7

这是一个很好的问题,关于此部分的C++标准4.7 积分转换说:

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

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

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

脚注有49用地说:

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

这是更直接和清晰地给我们的结果-1 + MAX + 1MAX,不管是什么类型的操作数是.