我想知道从较小的有符号整数到较大的无符号整数的类型转换。似乎编译器首先将有符号整数转换为与目标大小相同的有符号整数,然后转换为无符号整数。
请注意以下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
。
答案 0 :(得分:3)
签名到无符号转换使用 modulo 2 n 算术。从C ++ 11标准中, 4.7积分转换[conv.integral] (§4.7/ 2)部分:
如果目标类型是无符号的,则结果值是与源一致的最小无符号整数 整数(modulo 2 n 其中 n 是用于表示无符号类型的位数。)
所以j
取值2 64 - 10,即0xfffffffffffffff6
。