Вопрос на самом деле исходит из этого фрагмента
int a = -1;
unsigned int c=1;
long long b = c<<31;
printf("%d %lld %d\n",a,b,a>b);
Я протестировал его на Linux GCC (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3), результат:
-1 2147483648 0
На самом деле я не могу понять результат. По моему мнению, когда вы делаете a> b, a сначала конвертируется в long long, поэтому a равно 0000 … 01111 … 1 (32 нуля + 32 единицы), b равно 000..01000 … 00 ( 32 нуля + один + 31 ноль), тогда a должно быть больше, чем b.
Я что-то упускаю из целочисленного сравнения в C ++?
Перед сравнением значение a
превращается в long long
который по-прежнему имеет значение -1.
Результат верный. a — это целое число со знаком, поэтому -1 отрицательно. б длинная подписанная длинна; это имеет положительный знак. Конечно, отрицательное число не больше положительного.
Если вы хотите (по какой-то причине!) Показать длинную строку без знака, это будет сделано:
printf («% ull% lld% d \ n», a, b, a> b);
Если вы хотите заставить его подписать длинную строку без знака:
без знака длинный длинный a = топор;
И если вы хотите сравнить его с b и, таким образом, рассматривать его как длинную без знака без объявления таковой:
printf («% d% lld% d \ n», a, b, a> (длинная строка без знака) b);