Строго говоря, требуются ли беззнаковые суффиксы для литералов в какой-либо побитовой операции?

Строго говоря, согласно стандарту C, требуются ли беззнаковые суффиксы для числовых литералов в любой побитовой операции (во избежание UB)? В частности, в отношении сдвигов я думаю, что это неопределенное поведение при использовании знаковых чисел, и я понимаю, что литералы подписаны, но я не уверен. Т.е.

4 << x; // or is 4U << x required?
4 >> x;
4 & x;
4 | x;
// etc. for all bit ops

x << 4;
x >> 4;
// etc.

где 4 — заполнитель для любого литерала.

Я знаю, что большинству компиляторов все равно, меня просто интересует, что говорит спецификация.

4 << x вызовет UB для некоторых (не всех) значений x. 4U << x также вызовет UB для некоторых (не всех) значений x. В любом случае вы можете не предоставлять такие значения.
n. m. could be an AI 16.07.2024 10:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Нет, суффикс unsigned не является строго обязательным при использовании побитовых операторов, поскольку стандарт ANSI C в главе 2.9 гласит, что побитовые операторы должны применяться к целочисленным операндам signed или unsigned (char, short, int и long).

Однако, особенно при сдвигах, где количество битов для сдвига не может быть отрицательным числом, было бы несколько правильнее указать его в любом случае.

Очевидно, вам также понадобится суффикс, когда литерал не вписывается в целое число.

tofro 16.07.2024 10:47

@tofro почему? Если литерал не помещается в int, автоматически будет выбран наибольший целочисленный тип. Вы имели в виду "если результат смещения" не подходит?

Gerhardh 16.07.2024 11:13

Ни одна версия стандарта C, от стандарта ANSI C 1990 года до стандарта ISO C 2023 года, не имеет главы 2.9, раздела 2.9 или пункта 2.9. Возможно, вы имеете в виду «Язык программирования C» Кернигана и Ритчи, в разделе 2.9 обоих изданий которого рассматриваются побитовые операторы. На обложке второго издания имеется красная печать «ANSI C», но это маркетинговый ход, указывающий на то, что книга была обновлена ​​с учетом стандарта ANSI C. Это не означает, что книга соответствует стандарту ANSI C.

Eric Postpischil 16.07.2024 12:03

В стандарте C нет запрета на использование целочисленного литерала (который в стандарте называется «константой») без беззнакового суффикса. Однако для получения желаемого результата может потребоваться суффикс.

Проще всего рассмотреть 1 << n, где n — 31, а int — 32 бита. Тогда 1 << n не определяется стандартом C, поскольку 231 не представимо в int, но 1u << n определено.

Понимаю. Спасибо. Думаю, тогда я задал неправильный вопрос, на самом деле я хотел спросить «исключить случай, когда число непредставимо, для каких побитовых операций результат будет отличаться при использовании беззнакового и знакового литерала».

You'reNotARobot 16.07.2024 12:10

Другие вопросы по теме