В C ++ 11, согласно en.cppreference.com ,
Для подписанного и неотрицательного a значение << b равно <em>a * 2 b , если оно представимо в возвращаемом типе, в противном случае поведение не определено.
Насколько я понимаю, с 255 * 2 24 не представляется как int32_t
, оценка (int32_t) 255 << 24
дает неопределенное поведение.Это верно?Может ли это зависеть от компилятора?Это среда IP16, если это имеет значение.
Справочная информация: это исходит из аргумента, который у меня есть с пользователем на arduino.stackexchange.com.По его словам, «в этом нет ничего неопределенного»:
вы заметили, что большая часть сдвига битов «определяется реализацией».Таким образом, вы не можете цитировать главу и стих из спецификации.Вы должны обратиться к документации GCC, так как это единственное место, которое может рассказать вам, что на самом деле происходит. gnu.org / software / gnu-c-manual / gnu-c-manual.html # Bit-Shifting - это только "неопределенное" для отрицательного значения сдвига.
Редактировать : Судя по ответам, мое чтение стандарта C ++ 11 кажется правильным.Тогда ключевая часть моего вопроса - вызывает ли это выражение неопределенное поведение в gcc .Как отмечает в своем комментарии davmac, я спрашиваю: «Определяет ли GCC, реализация, поведение, даже если оно не определено языковым стандартом».
Из руководства gcc, с которым я связан, может показаться,оно действительно определено, хотя я нахожу, что формулировка этого руководства больше похожа на учебник, чем на «закон о языке».Из ответа PSkocik (и комментария Кейна к этому ответу) вместо этого может показаться, что он не определен.Так что я все еще сомневаюсь.
Полагаю, моя мечта заключалась бы в том, чтобы в какой-то документации gcc было четкое утверждение о том, что 1) gcc не определяет поведения, явно не определенного в стандарте, или 2)gcc определяет это поведение в версии XX.XX и обязуется сохранить его во всех последующих версиях.
Редактировать 2 : PSkocik удалил свой ответ, который, на мой взгляд, вызывает сожаление, поскольку предоставил интересную информацию,Из его ответа, комментария Кейна к ответу и моих собственных экспериментов:
(int32_t)255<<24
выдает ошибку времени выполнения при компиляции с помощью clang и -fsanitize=undefined
- тот же код не выдаетошибка с g ++ даже при
-fsanitize=undefined
(int32_t)256<<24
действительно дает ошибку времени выполнения при компиляции с g++ -std=c++11 -fsanitize=undefined
Точка 2 согласуется с интерпретацией, что gcc в C +Режим +11, определяет сдвиг влево более широко, чем стандартный.Согласно пункту 3, это определение может быть просто определением C ++ 14.Однако точка 3 не соответствует с идеей, что указанное в руководстве руководство является полным определением <<
в gcc (режим C ++ 11), так как это руководство не дает никаких намеков на то, что(int32_t)256<<24
может быть неопределенным.