0

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

请注意以下 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.

4

1 回答 1

3

有符号到无符号转换使用模 2 n算术。来自 C++11 标准,第4.7 节积分转换 [conv.integral](第 4.7/2 节):

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

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

于 2013-08-29T09:33:27.700 回答