предупреждение: счетчик смещения влево> = ширина типа - PullRequest
51 голосов
/ 17 ноября 2010

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

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

Ответы [ 6 ]

74 голосов
/ 17 ноября 2010

long может быть 64-битным типом, но 1 по-прежнему int.Вам нужно сделать 1 a long int, используя суффикс L:

unsigned long x = 1UL << 32;

(Вы также должны сделать это unsigned, используя суффикс U, как я показал, чтобы избежатьпроблемы сдвига влево целого числа со знаком. Нет проблем, когда long имеет ширину 64 бита и вы смещаетесь на 32 бита, но это будет проблемой, если вы сместили 63 бита)

15 голосов
/ 11 августа 2012

unsigned long - это 32-битный или 64-битный, который зависит от вашей системы.unsigned long long всегда 64 бит.Вы должны сделать это следующим образом:

unsigned long long x = 1ULL << 32
1 голос
/ 29 марта 2012

Вы не можете сдвинуть значение до его максимального бита

int x;         // let int be 4 bytes so max bits : 32 
x <<= 32; 

Итак, выдается предупреждение

left shift count >= width of type (i.e type = int = 32 )

1 голос
/ 18 ноября 2010

unsigned long x = 1UL << 31; </p>

Не показывать сообщение об ошибке.Потому что, прежде чем указать 32, это не так, потому что только ограничено 0-31.

0 голосов
/ 10 июля 2019

Принятое решение подходит для [константы] ULL << 32, но не подходит для существующих переменных - например, [переменная] << 32.Полное решение для переменных: ((unsigned long long) [variable] << 32).В сторону: Мое личное мнение об этом предупреждении заключается в том, что оно совершенно не нужно в первую очередь.Компилятор может видеть, что является типом принимаемых данных, и знает ширину параметров из определений в заголовках или постоянных значениях.Я полагаю, что Apple может сделать компилятор clang немного более интеллектуальным, чем в отношении этого предупреждения. </p>

0 голосов
/ 10 марта 2014

Вы можете использовать что-то подобное:

unsigned long x = 1;
x = x << 32;
...