2013-03-27 2 views
-1

вопрос на самом деле происходит из этого фрагментаКак вы можете безопасно сравнить 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++?

+0

Нет, преобразование между подписанными типами не работает. -1 преобразуется в -1, а не к некоторому большому положительному значению. –

ответ

1

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

+0

, поэтому я думаю, что в C++ значение unsigned побитовое сравнение. подписанный тип нет. Затем, как это делает сравнение для подписанного типа? Преобразовать его для дополнения и выполнения побитового сравнения? –

+0

Побитовое сравнение по-разному. Числа сравниваются как числа. –

+0

@ н.м. как он делает сравнение значений внутри машины? В какой-то степени это должно быть в двоичном сравнении? –

0

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

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

Е («% Улла% ДНУ% d \ п», а, Ь, а> б);

Если вы хотите, чтобы заставить его в беззнаковое долго долго:

неподписанный долго долго = ах;

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

Е («% d% ДНУ% d \ п», а, b, a> (без знака длинный) b);