Как можно безопасно сравнить 32-разрядное целое число с 64-разрядным целым числом в C ++ и как внутреннее сравнение целого числа со знаком?

Вопрос на самом деле исходит из этого фрагмента

 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 ++?

-1

Решение

Перед сравнением значение a превращается в long long который по-прежнему имеет значение -1.

1

Другие решения

Результат верный. a — это целое число со знаком, поэтому -1 отрицательно. б длинная подписанная длинна; это имеет положительный знак. Конечно, отрицательное число не больше положительного.

Если вы хотите (по какой-то причине!) Показать длинную строку без знака, это будет сделано:

printf («% ull% lld% d \ n», a, b, a> b);

Если вы хотите заставить его подписать длинную строку без знака:

без знака длинный длинный a = топор;

И если вы хотите сравнить его с b и, таким образом, рассматривать его как длинную без знака без объявления таковой:

printf («% d% lld% d \ n», a, b, a> (длинная строка без знака) b);

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector