2012-02-23 3 views
1

В моей программе две переменные объявлены как подписанные долго (пусть говорят X и Y на 32-битной машине), и они делятся на другие (X/Y).Беззнаковое и подписанное деление на C

Конечное значение присваивается переменной без знака (пусть говорят, Z). Я не уверен, правильно это или нет. Я просто отлаживаю код, который был написан кем-то. Я думаю, это может привести к переполнению или неопределенному состоянию.

Что происходит в ниже четырех сценариев,

Z =+X/+Y 
Z =+X/-Y 
Z =-X/+Y 
Z =-X/-Y 

Я знаю, что% и, для неподписанных и% D для целого числа. Мой вопрос заключается в том, какое значение будет храниться в Z в четырех вышеупомянутых сценариях.

Любая помощь была бы принята с благодарностью.

+3

Почему вы не можете попробовать это самостоятельно, чтобы получить первую идею? –

+2

Это не вопрос разделения. Это вопрос о подписке на неподписанное преобразование: http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe –

+3

@JensGustedt Вы выступаете за программирование пробной версией и ошибка? Я считаю, что это плохие советы. –

ответ

0

Если ваши переменные подписаны, все в порядке. Возможно, после этого есть (нежелательное?) Преобразование, если вы получите отрицательный результат деления.

Работа с выражениями, содержащими значения без знака, более болезненна, например.

(1U-2)/10 

дает неожиданные результаты.

0

Z будет хранить значение целочисленного деления, но поскольку Z без знака, все значения будут положительными, и, следовательно, битовый знак не будет обрабатываться как таковой, а как часть номера, а также будет конверсия до двух дополнений. Например, если беззнаковое целочисленное значение является 32-битным:

X = 1, Y = 1 -> Z = 1 
X = -1, Y = 1 -> Z = 4294967295 = 0xFFFFFFFF (this would be -1 -two's complement- if Z was signed) 
1

Вы получите мусор, если результат деления является отрицательным.

Например:

unsigned z; 
int a = 10; 
int b = -2; 
z = a/b; 

затем z == 4294967291.

+0

Я согласен с вами, но как контролировать эту ситуацию, не сохраняя эти неожиданные результаты, особенно когда один из них отрицательный (X и Y). – rakeeee

+0

@raki Что вы имеете в виду? Что вы хотите, когда пытаетесь сохранить отрицательное значение в неподписанном типе? –

+0

@raki, я не понимаю, чего вы хотите. Если <0 или b <0, вам придется обрабатывать этот назначенный особый способ, например. int x = (int) z – neciu