より小さな符号付き整数からより大きな符号なし整数への型変換について疑問に思います。コンパイラは最初に符号付き整数を宛先と同じサイズの符号付き整数に変換し、次に符号なし整数に変換するようです。
次の 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
.