C ++签名整数转换为无符号的更多位

时间:2013-08-29 09:22:02

标签: c++ integer type-conversion

我想知道从较小的有符号整数到较大的无符号整数的类型转换。似乎编译器首先将有符号整数转换为与目标大小相同的有符号整数,然后转换为无符号整数。

请注意以下C ++代码:

#include <assert.h>
#include <iostream>

typedef int sint;
typedef unsigned __int64 luint;

int main(int, char**) {
   assert(sizeof(luint) > sizeof(sint));
   sint i = -10;
   luint j = i;
   std::cout << std::hex << j;
}

在Visual C ++下,这会产生:fffffffffffffff6

这是我喜欢的。我可以确定所有编译器都会以这种方式运行吗?如果有符号整数首先转换为无符号整数,然后转换为新大小,则结果将为fffffff6

1 个答案:

答案 0 :(得分:3)

签名到无符号转换使用 modulo 2 n 算术。从C ++ 11标准中, 4.7积分转换[conv.integral] (§4.7/ 2)部分:

  

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

所以j取值2 64 - 10,即0xfffffffffffffff6