1

自動変換を考慮して、Cコンパイラは長整数リテラルを表す「L」をどのように解釈しますか? 次のコードを 32 ビット プラットフォーム (32 ビット長、64 ビット長) で実行すると、式 "(0xffffffffL)" が 32 ビット -1 ではなく 64 ビット整数 4294967295 にキャストされるようです。

サンプルコード:

#include <stdio.h>

int main(void)
{
  long long x = 10;
  long long y = (0xffffffffL);
  long long z = (long)(0xffffffffL);

  printf("long long x == %lld\n", x);
  printf("long long y == %lld\n", y);
  printf("long long z == %lld\n", z);

  printf("0xffffffffL == %ld\n", 0xffffffffL);

  if (x > (long)(0xffffffffL))
    printf("x > (long)(0xffffffffL)\n");
  else
    printf("x <= (long)(0xffffffffL)\n");

  if (x > (0xffffffffL))
    printf("x > (0xffffffffL)\n");
  else
    printf("x <= (0xffffffffL)\n");
  return 0;
}

出力 (32 ビット Debian で GCC 4.5.3 でコンパイル):

long long x == 10
long long y == 4294967295
long long z == -1
0xffffffffL == -1
x > (long)(0xffffffffL)
x <= (0xffffffffL)
4

2 に答える 2

7

これは 16 進数のリテラルであるため、その型は符号なしにすることができます。に収まるunsigned longので、それが得られるタイプです。標準のセクション 6.4.4.1 を参照してください。

整数定数の型は、その値を表すことができる対応するリストの最初のものです。

サフィックス付きの 16 進数リテラルのリストは次のとおりLです。

  1. long
  2. unsigned long
  3. long long
  4. unsigned long long

32 ビットの signed には収まらずlong、unsigned 32ビットには収まらないためunsigned long、そのようになります。

于 2013-03-19T20:53:12.927 に答える
4

問題は、整数リテラルの型を決定する規則が、10 進数か 16 進数 (または 8 進数) かによって異なるということです。10 進リテラルは、接尾辞が U でない限り、常に符号付きです。16 進または 8 進リテラルは、符号付きの型に値を含めることができない場合、符号なしにすることもできます。

于 2013-03-19T20:51:55.923 に答える