1 << 31 не может быть представлен типом 'int'? - PullRequest
0 голосов
/ 01 декабря 2018

Почему -fsanitize=undefined throw

ошибка времени выполнения: сдвиг влево на 1 на 31 позицию не может быть представлен в виде 'int'

в этом коде

uint32_t z;
z = 1 << 31;

?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Поскольку сдвиг влево на 1 на 31 позицию не может быть представлен в виде int.

Математически, 1 << 31 равно 2 31 или 2147483648.INT_MAX в типичной системе (где int - 32 бита) is one less than that, or 2147483647`.Если арифметическая операция со знаком типа переполняется (дает результат вне результата типа), поведение не определено.(Не думайте, что это обернется. Возможно, но язык не гарантирует этого.)

Если вам нужен тип, который может представлять это значение, вы можете использовать тип без знака, который по крайней мере 32бит в ширину или тип со знаком более 32 бит.unsigned long или long long гарантированно будет таким широким.(Язык не гарантирует, что int имеет ширину более 16 бит, но, скорее всего, он будет 32 в большинстве систем.)

0 голосов
/ 01 декабря 2018

Сделать 1 без знака:

uint32_t z;
z = UINT32_C(1) << 31;
...