Я видел следующий код в книге Компьютерные системы: перспектива программиста, 2/E. Это хорошо работает и создает желаемый результат. Вывод может быть объяснен различием подписанных и неподписанных представлений.В чем разница между литералами и переменными в C (подписанный с беззнаковым коротким ints)?
#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
. Почему это произошло? Я не могу это объяснить.
Обратите внимание, что я видел похожие вопросы, такие как this, но они не помогают.
PS. Как сказал @Abhineet, дилемму можно решить, изменив short
на int
. Однако как объяснить эти явления? Другими словами, -1
в 4 байтах - 0xff ff ff ff
, а в 2 байтах - 0xff ff
. Учитывая их как 2s-дополнение, которые интерпретируются как unsigned
, они имеют соответствующие значения 4294967295
и 65535
. Они оба не менее 0
, и я думаю, что в обоих случаях выход должен быть -1 >= 0u
, то есть x >= u
.
Выходной образец для него на небольшой Endian системы Intel:
Для краткости:
-1 < 0u
u =
00 00
x =
ff ff
Для междунар:
-1 >= 0u
u =
00 00 00 00
x =
ff ff ff ff
[Аналогичный вопрос] (http://stackoverflow.com/questions/17312545/type-conversion-unsigned-to-signed-int-char). – Lundin
C ведет себя в терминах * значений *, а не представлений. Все материалы о дополнении 2 и ffff и 65535 и т. Д. Не имеют значения. –
Не используйте форматирование кода для текста, который не является кодом. – EJP