2

私は符号付き-符号なしの整数変換を研究していて、これらの結論に達しました。これが正しいかどうか教えてください。

unsigned short var = -65537u;

手順:

  • 65537u (暗黙的に unsigned int に変換)

バイナリ表現: 0000 0000 0000 0001 0000 0000 0000 0001

  • -65537u

バイナリ表現: 1111 1111 1111 1110 1111 1111 1111 1111

  • 短く切り捨て

バイナリ表現: 1111 1111 1111 1111

  • unsigned short として読む: 65535

以下の場合も同様とする。

unsigned short var = -65541u;
  • 65541u (符号なし整数)

0000 0000 0000 0001 0000 0000 0000 0101

  • -65541u

1111 1111 1111 1110 1111 1111 1111 1011

  • 短く切り捨て

1111 1111 1111 1011

  • unsigned short として読む: 65531

unsigned short var = -5u;
  • 5u (符号なし整数)

0000 0000 0000 0000 0000 0000 0000 0101

  • -5u

1111 1111 1111 1111 1111 1111 1111 1011

  • 短く切り捨て

1111 1111 1111 1011

  • unsigned short として読む: 65531
4

2 に答える 2

2

shortあなたの分析は、 16 ビットとint32 ビットの通常のプラットフォームでは正しいです。

一部のプラットフォームでは、定数65537が に収まらない場合がありますunsigned intが、その場合は65537u、より大きな符号なしの型として型付けされます。試行されるタイプのリストは、C99 標準のセクション 6.4.4.1:5 にあります。C99 では、少なくとも に収まりますunsigned long。これは、標準によって大きな値を許可することが保証されています。

unsigned shortそれが起こった場合、割り当てのために変換が戻るまで、推論はほとんど同じままです。

逆にunsigned short、C99 標準では、16 ビットを超える保持が許可されています。この場合、最初の例でvar受信USHRT_MAX-65536し、他の例でも同様です。

于 2013-03-02T11:20:17.593 に答える
0

short のサイズは実装に依存します - 16 ビットではありません。16 ビットが最小サイズです。

同様に、int のサイズも 16 ビットしかない場合があります。

于 2013-03-02T10:49:04.477 に答える