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 に答える