продвижение короткого целого числа без знака в 32-битной системе

У меня есть 32-битный целочисленный размер

если у меня есть арифметическое выражение вроде

unsigned short current_time, last_time
if((current_time - last_time) > timeout)

Я считаю, что current_time и last_time будут преобразованы в подписанное целое число 32 перед вычитанием. Нет никаких проблем с 16-битной целочисленной системой, но с этой 32-битной целочисленной системой может быть отрицательное значение из-за целочисленного продвижения?


person gogolf0401    schedule 14.10.2015    source источник
comment
Добавьте тег языка, C, C++ или ?   -  person Yu Hao    schedule 14.10.2015


Ответы (2)


Если current_time больше или равно last_time, отрицательного значения быть не может.

Чтобы процитировать раздел 6.2.1.2 «Целые числа со знаком и без знака» спецификации C90:

Когда значение с целочисленным типом преобразуется в другой целочисленный тип, если значение может быть представлено новым типом, его значение не изменяется.

Поскольку unsigned short короче, чем int, все значения типа unsigned short могут быть представлены int, поэтому значения current_time и last_time, преобразованные в int, будут такими же, как их непреобразованное значение unsigned short, а результат вычитания будет что вы ожидаете, что это будет.

Однако если current_time меньше last_time, возможно отрицательное значение; это, однако, не ошибка, а особенность, потому что в этом случае время действительно действительно пошло назад.

Если бы current_time и last_time были unsigned ints, а current_time были меньше last_time, результатом вычитания было бы unsigned int и, следовательно, не отрицательно; это будет разница между временами по модулю максимального значения unsigned int.

В любом случае, вы, вероятно, захотите обрабатывать время в обратном направлении, если это может произойти.

person Community    schedule 14.10.2015
comment
Я не знаю единицы измерения, но я предполагаю, что 16-битное время довольно часто переполняется. Если это так, то я также подозреваю, что лучше всего рассматривать время как круговое и вместо этого использовать (unsigned short) ((unsigned int) current_time - last_time) < timeout, тем самым правильно сравнивая значения времени в ограниченном кадре. В качестве альтернативы с приведением к подписанному короткому вместо этого, если возможны отрицательные периоды, и компиляцией для разумной среды дополнения до двух. - person doynax; 14.10.2015

Согласно современным правилам C, беззнаковые шорты будут преобразованы в подписанные целые числа, а разница будет правильно подписана в соответствии с их первоначальными значениями.

person Paul Kienitz    schedule 14.10.2015
comment
будет ли продвижение происходить по каждой переменной вычитания или только по результату? Если повышение происходит для каждой переменной перед вычитанием, возможно ли получить отрицательное значение после вычитания? Может быть, когда 16-битное значение текущего времени переполняется обратно до 0, а последний раз составляет 65000+? - person gogolf0401; 14.10.2015
comment
Да, если 16-битное значение переполняется и становится маленьким, то преобразование сохранит это маленькое значение, а вычитание вернет отрицательный результат. В этом случае продвижение не является вашей проблемой, в первую очередь проблема заключается в использовании неподписанного короткого текста. Если вы хотите избежать этого, вам нужно привести каждое значение отдельно к unsigned int. В этом случае вы получите значения, которые кажутся неправильными, но могут быть неверными. - person Paul Kienitz; 14.10.2015