int делится на unsigned int, вызывая опрокидывание - PullRequest
5 голосов
/ 16 марта 2011

Я пытаюсь разделить int на unsigned int и получаю неожиданный результат:

int b;
unsigned int c;
int res;
float res_f;

b = -25;
c = 5;

res = b / c;   // res = 858993454
res_f = b / c; // res_f = -5.000000

То же самое прекрасно работает для '+', '-' и '*', но не работает для '/',Что мне здесь не хватает?

PS

Он был протестирован на разных компиляторах, и результат был одинаковым.

1 Ответ

11 голосов
/ 16 марта 2011

Если предположить, что это C или аналог (например, цель C), измените:

res = b / c;

до:

res = b / (int)c;

Объяснение: b преобразуется из int в unsigned int в соответствии с правилами преобразования типов C для смешанных выражений. В процессе он переполняется от -25 до 0xFFFFFFE7 == 4294967271. Затем вы получите unsigned int результат 4294967271 / 5U = 858993454U, который затем неявно преобразуется обратно в int (на этом шаге переполнения нет, поскольку результат находится в диапазоне как 32-разрядных со знаком, так и без знака).

Кстати, результат float должен быть таким же, в пределах точности float (я получаю 858993472.0). Я удивлен, что вы получаете -5,0 в этом случае.

...