3

long i = 1;" " の代わりに " "と書いlong i = 1l;た場合、 は1として認識されint、暗黙的に に変換されlongますか?

編集:ありがとうございました。型変換がないことがわかります。サフィックスu(のような10u)もそうですか?lでは、それらのとの用途は何uですか?

4

5 に答える 5

3

定数の型1は int であるため、技術的には型変換が行われますが、コンパイル時に行われ、何も失われません。

ただし、次のより興味深い例を考えてみましょう。

int main(void)
{
    long long i = -2147483648;
    long long j = -2147483647 - 1;

    printf( " i is %lld, j is %lld\n", i, j);

    return(0);
}

さまざまなコンパイラから次の結果が得られます。

  • MSCV 9 (バージョン 15.00.21022.08):

                i is 2147483648, j is -2147483648
    
  • GCC (3.4.5):

                i is -2147483648, j is 0
    
  • コモー (4.3.10.1):

                i is 2147483648, j is -2147483648
    
  • デジタル火星:

                i is -2147483648, j is -2147483648
    

違いをどのように説明するかはまだわかりません。次の 1 つまたは複数の可能性があります。

  • コンパイラのバグ
  • オペランド昇格における C90 と C99 の規則 (" long long" のサポートは C99 ですが、これらのコンパイラの一部は " long long" を拡張子として C90 用にコンパイルしている可能性があります)
  • 実装定義の動作
  • 未定義の動作

実のところ、MSVC とコモーの動作は私が予想していたものです。最初の操作のロジック (私の考えでは) は次のとおりです。

  • -2147483648-は「 」としてトークン化され、2147483648
  • 2147483648unsigned int です (int に収まらないため、これは C99 では異なると思います)
  • 単項-演算子 ' 'を適用すると、2147483648符号なし算術規則により再び
  • それを long long に変換しても符号は変わりません。

2 番目の操作のロジックは次のとおりです。

  • -2147483647-は「 」としてトークン化され、2147483647
  • 2147483647符号付き整数です
  • その数を表すのに問題はないので、1結果を差し引く-2147483648
  • それを long long に変換しても符号は変わりません。
于 2009-09-29T15:07:29.327 に答える
1

記載されているとおりに正確に記述した場合、i = 1l; と同等になることは間違いありません。変換はコンパイル時に行われます。

ただし、書くと

long i = (unsigned int)-1;

それから私はおそらくあなたが期待したものではないでしょう.

于 2009-09-28T03:37:28.933 に答える
1

最近のほとんどのコンパイラは、リテラルを alongに割り当てていることを確認できるほどスマートである必要があり、割り当て前の変換を強制する代わりに、その型のリテラルを作成します。

于 2009-09-28T03:31:05.407 に答える
0

今日のコンパイラはそれを認識し、同じ結果を生成します。

于 2009-09-28T03:31:57.273 に答える
-1

コンパイラは、割り当てようとしているものを認識し、値をすぐに 1 に設定します。リテラルで発生する型変換はありません。long x = 1.0 と言ったとしても、実行時の型変換は表示されません。

ちなみに、Windows では long と int は同じなので、とにかく型変換はありません。

[編集: Windows に固有の最後のコメントを作成しました。プリプロセッサへの参照を削除]

于 2009-09-28T03:37:46.247 に答える