GCC コンパイラを使用して Linux 上で次のプログラムを実行すると、出力結果はどうなりますか?
これには型変換、データの切り捨て、埋め込みが含まれることを知っておいてください。しかし、具体的な説明がわかりませんか?
元の質問ソース: Linux 上の C 言語でのいくつかの古典的な面接の質問
char 的长度是 1 字节,并且,大多数的机器都将其视为有符号数的,所以它的表示范围是 [-128, 127](参见《深入理解计算机系统》P27~P28)。所以,当你给 c 赋值 127 时,你执行了 ++c の場合、1 バイトしかないため、オーバーフローが発生します。
char
[-128, 127]
c
++c
はマシンでは127を表します。2進数に変換すると、この01111111,可以看到,当你加 1 之后,结果就变成了 10000000,由于在计算机内部,负数是用补码来表示的,所以就变成了 -128。之后再 ++cのようになり、-127になります。
01111111
10000000
異なる種類であっても、メモリの一部であるコンピューター内ではすべて同じように動作します。したがって、タイプは制限ではありません。
この質問は言語ではなく 编译器 をテストします。 3 つの変数を定義します:
编译器
C言語ではcが計算に参加する場合、cをs_cに変換するかu_cに変換するかは编译器によって決まります。
gcc は c を符号付きとみなし、後続の計算と出力は符号付き数値として処理します。
char
的长度是 1 字节,并且,大多数的机器都将其视为有符号数的,所以它的表示范围是[-128, 127]
(参见《深入理解计算机系统》P27~P28)。所以,当你给c
赋值 127 时,你执行了++c
の場合、1 バイトしかないため、オーバーフローが発生します。はマシンでは127を表します。2進数に変換すると、この
01111111
,可以看到,当你加 1 之后,结果就变成了10000000
,由于在计算机内部,负数是用补码来表示的,所以就变成了 -128。之后再++c
のようになり、-127になります。異なる種類であっても、メモリの一部であるコンピューター内ではすべて同じように動作します。したがって、タイプは制限ではありません。
この質問は言語ではなく
リーリー编译器
をテストします。3 つの変数を定義します:
C言語ではcが計算に参加する場合、cをs_cに変換するかu_cに変換するかは
编译器
によって決まります。gcc は c を符号付きとみなし、後続の計算と出力は符号付き数値として処理します。