Подтвердить что ты не робот

Предупреждение: количество сдвигов влево >= ширина типа

Я очень новичок в работе с битами и застрял в следующем предупреждении при компиляции:

 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 неточными или я неправильно понял что-то фундаментальное?

4b9b3361

Ответ 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;