「long i = 1;」 Cで暗黙の型変換を引き起こしますか?
-
18-09-2019 - |
質問
「」と書くとlong i = 1;
" の代わりに "long i = 1l;
"、 1
として認識される int
そして暗黙的に次のように変換されます long
?
編集: 皆さん、ありがとうございました。型変換がないことがわかります。これは接尾語にも当てはまりますか u
(のように 10u
)?では、それらは何の役に立つのでしょうか l
そして u
?
解決
コンパイラを使用すると、すぐに1に値を代入して設定しようとしているかを確認します。リテラルで起こるいかなる種類の変換はありません。あなたが長いのx = 1.0を言っている場合でも、あなたは実行時の型変換は表示されません。
ところで、Windows上で、長いとint型は同じですので、とにかく型変換がないでしょう。
[編集:作られたWindowsに固有の最後のコメント。プリプロセッサを除去参照]
他のヒント
定数の型 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 vs.オペランドの昇格における C99 ルール ("
long long
" サポートは C99 ですが、これらのコンパイラの一部は、"long long
" 拡張子として) - 実装定義の動作
- 未定義の動作
FWIW、MSVC と Comeau の行動は私が予想していたものでした。これは多くの人にとって依然として驚くべきことかもしれません。最初の操作の (私の頭の中での) ロジックは次のとおりです。
-2147483648
' としてトークン化されます-
' そして2147483648
2147483648
unsigned int です (int に収まらないため、これは C99 では異なると思います)- 単項を適用する '
-
' 演算子の結果は2147483648
これも符号なし算術規則によるものです - それをlong longに変換しても符号は変わりません。
2 番目の操作のロジックは次のとおりです。
-2147483647
' としてトークン化されます-
' そして2147483647
2147483647
はsigned intです- 引き算
1
結果として-2147483648
その数字を表すのに問題はないので - それをlong longに変換しても符号は変わりません。
最近のほとんどのコンパイラは、あなたがlong
にリテラルを代入していることを確認するために十分にスマートでなければならず、代わりに前の代入変換を強制的にそのタイプのリテラルになります。
かなり確信= 1リットル; 任意の変換は、コンパイル時に行われます。
しかし、あなたが書いた場合は、
の長いI =(unsigned int型)-1;
そして、私はおそらくあなたが期待したものではありません。
今日のコンパイラはそれを認識し、同じ結果を生成します。