Предупреждение: количество сдвигов влево >= ширина типа
Я очень новичок в работе с битами и застрял в следующем предупреждении при компиляции:
7: warning: left shift count >= width of type
Моя строка 7 выглядит так:
unsigned long int x = 1 << 32;
Это имеет смысл, если размер long
в моей системе был 32 бит. Однако sizeof(long)
возвращает 8
, а CHAR_BIT
определяется как 8
, предполагая, что long должно быть 8x8 = 64 бит.
Что мне здесь не хватает? Являются ли sizeof
и CHAR_BIT
неточными или я неправильно понял что-то фундаментальное?
Ответы
Ответ 1
long
может быть 64-битным типом, но 1
по-прежнему является int
. Вам нужно сделать 1
a long int
с помощью суффикса L
:
unsigned long x = 1UL << 32;
(Вы также должны сделать это unsigned
с помощью суффикса U
, как я показал, чтобы избежать проблем с левым смещением целого числа со знаком. Нет проблем, когда long
имеет ширину 64 бит и вы меняете на 32 бита, но это будет проблемой, если вы переместили 63 бита)
Ответ 2
unsigned long
- 32 бит или 64 бит, что зависит от вашей системы. unsigned long long
всегда 64 бит. Вы должны сделать это следующим образом:
unsigned long long x = 1ULL << 32
Ответ 3
unsigned long x = 1UL < 31;
Не показывать сообщение об ошибке. Поскольку до того, как вы укажете 32, это не так, потому что оно ограничено только 0-31.
Ответ 4
Вы не можете переместить значение в его максимальный бит
int x; // let int be 4 bytes so max bits : 32
x <<= 32;
Итак, это генерирует предупреждение
left shift count >= width of type (i.e type = int = 32 )
Ответ 5
Принятое решение подходит для [constant] ULL << 32, но не подходит для существующих переменных - например, [variable] << 32. Полное решение для переменных: ((unsigned long long) [variable] << 32). В сторону: Мое личное мнение об этом предупреждении заключается в том, что оно совершенно не нужно в первую очередь. Компилятор может видеть, что является типом принимаемых данных, и знает ширину параметров из определений в заголовках или постоянных значениях. Я полагаю, что Apple может сделать компилятор clang немного более интеллектуальным, чем в отношении этого предупреждения.
Ответ 6
Вы можете использовать что-то вроде этого:
unsigned long x = 1;
x = x << 32;