long i = 1;
" " の代わりに " "と書いlong i = 1l;
た場合、 は1
として認識されint
、暗黙的に に変換されlong
ますか?
編集:ありがとうございました。型変換がないことがわかります。サフィックスu
(のような10u
)もそうですか?l
では、それらのとの用途は何u
ですか?
long i = 1;
" " の代わりに " "と書いlong i = 1l;
た場合、 は1
として認識されint
、暗黙的に に変換されlong
ますか?
編集:ありがとうございました。型変換がないことがわかります。サフィックスu
(のような10u
)もそうですか?l
では、それらのとの用途は何u
ですか?
定数の型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 つまたは複数の可能性があります。
long long
" のサポートは C99 ですが、これらのコンパイラの一部は " long long
" を拡張子として C90 用にコンパイルしている可能性があります)実のところ、MSVC とコモーの動作は私が予想していたものです。最初の操作のロジック (私の考えでは) は次のとおりです。
-2147483648
-
は「 」としてトークン化され、2147483648
2147483648
unsigned int です (int に収まらないため、これは C99 では異なると思います)-
演算子 ' 'を適用すると、2147483648
符号なし算術規則により再び2 番目の操作のロジックは次のとおりです。
-2147483647
-
は「 」としてトークン化され、2147483647
2147483647
符号付き整数です1
結果を差し引く-2147483648
記載されているとおりに正確に記述した場合、i = 1l; と同等になることは間違いありません。変換はコンパイル時に行われます。
ただし、書くと
long i = (unsigned int)-1;
それから私はおそらくあなたが期待したものではないでしょう.
最近のほとんどのコンパイラは、リテラルを along
に割り当てていることを確認できるほどスマートである必要があり、割り当て前の変換を強制する代わりに、その型のリテラルを作成します。
今日のコンパイラはそれを認識し、同じ結果を生成します。
コンパイラは、割り当てようとしているものを認識し、値をすぐに 1 に設定します。リテラルで発生する型変換はありません。long x = 1.0 と言ったとしても、実行時の型変換は表示されません。
ちなみに、Windows では long と int は同じなので、とにかく型変換はありません。
[編集: Windows に固有の最後のコメントを作成しました。プリプロセッサへの参照を削除]