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

时间:2014-02-14 01:15:14

标签: c++ casting size

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

static_cast<unsigned long>(-1)

据我所知,C ++标准定义了将有符号整数值转换为无符号整数类型时会发生什么(请参阅:What happens if I assign a negative value to an unsigned variable?)。

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

用代码澄清,

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)

2 个答案:

答案 0 :(得分:14)

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

  

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

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

答案 1 :(得分:6)

这是一个很好的问题,此部分的draft C++ standard 4.7 整体转化表示:

  

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

不是最直接的解释,在这种情况下,我会回到draft C99 standard说:

  

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

脚注49有用地说:

  

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

这更加直截了当,无论操作数的类型是什么,显然都会将结果显示为-1 + MAX + 1 MAX