私は本Computer Systems: A Programmer's Perspective, 2/Eで次のコードを見たことがあります。これはうまく機能し、目的の出力を作成します。出力は、符号付き表現と符号なし表現の違いによって説明できます。
#include<stdio.h>
int main() {
if (-1 < 0u) {
printf("-1 < 0u\n");
}
else {
printf("-1 >= 0u\n");
}
return 0;
}
上記のコードは を生成-1 >= 0u
しますが、上記と同じである次のコードは生成しません! 言い換えると、
#include <stdio.h>
int main() {
unsigned short u = 0u;
short x = -1;
if (x < u)
printf("-1 < 0u\n");
else
printf("-1 >= 0u\n");
return 0;
}
利回り-1 < 0u
。なぜこれが起こったのですか?これは説明できません。
このような同様の質問を見たことがありますが、役に立たないことに注意してください。
PS。@Abhineetが言ったように、ジレンマはに変更short
することで解決できますint
。しかし、この現象をどのように説明できるでしょうか。つまり、-1
4 バイトでは0xff ff ff ff
、2 バイトでは0xff ff
です。として解釈される 2 の補数としてそれらを考えるとunsigned
、それらは と の対応する値を4294967295
持ち65535
ます。どちらも 未満ではなく、どちらの場合も、出力は、つまり で0
ある必要があると思います。-1 >= 0u
x >= u
リトルエンディアン Intel システムでの出力例:
略して:
-1 < 0u
u =
00 00
x =
ff ff
int の場合:
-1 >= 0u
u =
00 00 00 00
x =
ff ff ff ff