После прочтения вопроса 32 bit unsigned multiply on 64 bit causing undefined behavior? здесь, в StackOverflow, я начал задумываться над тем, могут ли типичные арифметические операции над малыми типами без знака привести к неопределенному поведению в соответствии со стандартом C99.Может ли генерация целых чисел без знака привести к неопределенному определенному поведению?
Например, возьмем следующий код:
#include <limits.h>
...
unsigned char x = UCHAR_MAX;
unsigned char y = x + 1;
Переменная x
инициализируется до максимальной величины для данного типа unsigned char
данных. Следующая строка - проблема: значение x + 1
больше, чем UCHAR_MAX
и не может быть сохранено в переменной unsigned char
y
.
Я считаю, что на самом деле происходит следующее.
- переменной
x
сначала повышен до типа данныхint
(раздел 6.3.1.1/2), тоx + 1
оценивается как типint
данных.
Пусть есть реализация, где INT_MAX
и UCHAR_MAX
же - x + 1
приведет Целочисленное переполнение. Означает ли это, что приращение переменной x
, несмотря на то, что это целочисленный тип без знака, может привести к неопределенному поведению из-за возможного переполнения целочисленного числа?
Если 'sizeof (unsigned char) == sizeof (int)', применяется первый сценарий. – chux
@chux Почему промотирование не происходит, если 'int' может представлять значение? –
Я рассмотрю «6.3.1.8. Обычные арифметические преобразования». Это, кажется, сначала применимо »В противном случае, если операнд, имеющий беззнаковый целочисленный тип, имеет ранг, больший или равный рангам типа другого операнда, то операнд со знаком целочисленный тип преобразуется в тип операнда с целым типом без знака. " Это происходит до «В противном случае, если тип операнда со знаком целочисленного типа может представлять все значения типа операнда с типом unsigned integer type ...». – chux