純粋な ansi C では、それを示す方法はありますか?
char c1 = 1, c2 = 2;
次のタイプ:
c1 + c2
はintですか?
ありがとう。
注: 標準によればそうであることはわかっていますが、C++ では typeid 演算子を使用して表示できます。c1 + c2
Cのintであることを示したいと思います。
純粋な ansi C では、それを示す方法はありますか?
char c1 = 1, c2 = 2;
次のタイプ:
c1 + c2
はintですか?
ありがとう。
注: 標準によればそうであることはわかっていますが、C++ では typeid 演算子を使用して表示できます。c1 + c2
Cのintであることを示したいと思います。
そのようなことを証明することはできません。ACコンパイラは、観察可能な結果が抽象マシンの場合と同じであるという条件で、すべての操作を好みに合わせて置き換えることができます。アディションの結果(右辺値)に直接アクセスできないため、そのタイプは観察できず、サイズ、幅、または符号もわかりません。
c1 = 255でx2が255の場合、追加するとti 510が追加されます。これは、charには大きすぎますが、intには問題ありません。
int x = c1 + c2;
整数の昇格が右辺値で行われるという事実ではありませんか?
c1
とc2
は左辺値です。の結果のみがc1 + c2
右辺値です。
したがって、加算は char で実行する必要があり、それによってオーバーフローが発生し、1
.
ただし、その後、値をchar
含む型の右辺値は、その値を保持1
するように昇格されint
ます (C++ の場合)。そのため、それに応じて出力cout
が表示されます。int
cout
char が与えられた場合1
、印刷できない文字である ASCII 値を持つ文字を出力する必要があります。
私はこれがc ++であることを知っていますが、フォーマット指定子を必要とするprintfとは異なり、型を決定するため、coutを使用したかった(つまり、結果を変更します)
char c1=156, c2=101;
cout << c2 + c1 << endl;
出力は1で、オーバーフローします。範囲は 0 ~ 255 です。結論: int ではなく char です。
sizeof() で確認してみてはいかがでしょうか。自分でチェックしませんでした。ただのアイデア。