Почему в C++ при сдвиге не получается ноль? [дубликат]

124
15 октября 2019, 05:20

На данный вопрос уже ответили:

  • Работа оператора сдвига на число бит, превышающее разрядность переменной 2 ответа
(uint64_t)1 << (size- (size - 1) / 64*64)   1   unsigned __int64
((uint64_t)1 <<64)                          0   unsigned __int64 
(size- (size - 1) / 64*64)                  64  int
int size=128;

Почему первое выражение не 0?

Visual C++ 2017

Answer 1

Из стандарта ([expr.shift]p1) об <<:

Если правый операнд отрицательный либо его значение больше или равно длине (в битах) левого операнда после расширения, то поведение программы не определено.

128-(128-1)/64*64 = 64

Т.е. равно длине левого операнда - так что поведение не определено...

READ ALSO
Ошибка линковки в Qt5 {Пустой проект}

Ошибка линковки в Qt5 {Пустой проект}

При попытке запустить вот такой код :

119
Как правильно составить запрос в retrofit?

Как правильно составить запрос в retrofit?

Имею api формата localhost/api/?authmethod={"username" : "value1", "password" : "value2"}

113
Javac не генерирует warning на @Deprecated

Javac не генерирует warning на @Deprecated

Компилирую такой код

92
Что такое lazy и eager операторы?

Что такое lazy и eager операторы?

При изучении Stream API, часто встречал употребление выражений lazy и eager операторы, но нигде толком не мог найти нормальное определение этих понятий

113