Каков тип результата? Является ли это возможным?

Пытаюсь найти ответ на свой вопрос... Какой тип этого выражения будет на языке C?

unsigned short a, b;
a = 0x1;
b = 0x2;
if ((a ^ b) > 0) //This expression... 
...

Я понимаю, что это не совсем корректный код, который может вызвать ошибку. Я должен использовать != вместо >.

Я думаю, что тип результата выражения будет unsigned int. Я читал об этом в книге Стивена Пратта.

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

Если эти две переменные имеют какие-либо другие значения, может ли это выражение быть меньше нуля? (Если мы установим старший бит в числе, он станет отрицательным, при условии, что он имеет знаковый тип данных)

Я думаю, что это невозможно, но я могу ошибаться. Я сделал предположение, но хочу знать правильный ответ на свой вопрос.

Если INT_MAX меньше, чем USHORT_MAX, выражение будет иметь тип int. Следовательно, чтобы иметь минимальный воспроизводимый пример, вам нужно опубликовать соответствующие значения из limits.h.

EOF 29.05.2019 22:10

Результат XOR не может быть больше 0xFFFF. Спасибо.

Noisy88 29.05.2019 22:13

Как вы это понимаете?

EOF 29.05.2019 22:14

Максимальное значение unsigned short может быть только 0xFFFF. Если у нас есть a равно 0xFFFF и b равно 0, то результатом XOR будет 0xFFFF. 16-битный тип данных...

Noisy88 29.05.2019 22:17

Максимальное значение, которое может содержать unsigned short, — это не 0xFFFF, а USHRT_MAX, значение которого определяется реализацией не меньше 65535. Следовательно, значение может быть больше. Кроме того, значение INT_MAX также определяется реализацией и может составлять всего 32767.

EOF 29.05.2019 22:22

Следовательно, результат зависит от реализации компилятора, верно?

Noisy88 29.05.2019 22:27

О каком выражении вы спрашиваете, a ^ b, (a ^ b), (a ^ b) > 0 или о чем-то другом?

Eric Postpischil 29.05.2019 22:30

(а^б). Мне было интересно, может ли случиться так, что результатом этого выражения будет отрицательное число. в этом случае результат выражения ((a^b) > 0) будет ложным.

Noisy88 29.05.2019 22:39
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
8
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В (a ^ b) > 0, где a и b это unsigned short:

  • Если unsigned short уже, чем int, a и b преобразуются в int (согласно целые акции, C 2018 6.3.1.1 2, и поскольку unsigned short уже, чем int, обязательно означает, что int может представлять все значения unsigned short).
  • В противном случае a и b преобразуются в unsigned int (там же).
  • Для a ^ b выполняются обычные арифметические преобразования (6.5.11). В этом выражении обычные арифметические преобразования не меняют типы (6.3.1.8 1). Также в соответствии с обычными арифметическими преобразованиями результат имеет тот же тип, что и операнды после преобразования. Таким образом, результатом будет int или unsigned int, как описано выше.
  • (a ^ b) имеет тот же тип, что и a ^ b (6.5.1 5).
  • Для (a ^ b) > 0 результат имеет тип int (6.5.8 6).
Ответ принят как подходящий

Выражение a ^ b, вероятно, имеет тип int, но будет иметь тип unsigned int в том случае, если есть какие-либо значения, которые могут быть представлены как unsigned shorts, но не как ints. Его значение не будет превышать USHRT_MAX для общих a и b типа unsigned short, а для конкретных a и b в примере будет ровно 3.

(Из комментариев :)

I wondered if it could happen that the result of [(a^b)] would be a negative number. in this case, the result of the expression ((a^b) > 0) will be a false

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

Выражение (a ^ b) > 0 имеет тип int и оценивается как 1 для заданных a и b. В более общем смысле он дает тот же результат, что и a != b для a и b целочисленного типа. Конечно, это могу оценивается как 0. С другой стороны, связанное выражение (a ^ b) >= 0 всегда будет оцениваться как 1 для a и b беззнакового типа.

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