Пытаюсь найти ответ на свой вопрос... Какой тип этого выражения будет на языке C?
unsigned short a, b;
a = 0x1;
b = 0x2;
if ((a ^ b) > 0) //This expression...
...
Я понимаю, что это не совсем корректный код, который может вызвать ошибку. Я должен использовать != вместо >.
Я думаю, что тип результата выражения будет unsigned int. Я читал об этом в книге Стивена Пратта.
Если у нас есть два типа, то результатом выражения, включающего эти типы, должен быть старший тип. (целое или беззнаковое целое)
Если эти две переменные имеют какие-либо другие значения, может ли это выражение быть меньше нуля? (Если мы установим старший бит в числе, он станет отрицательным, при условии, что он имеет знаковый тип данных)
Я думаю, что это невозможно, но я могу ошибаться. Я сделал предположение, но хочу знать правильный ответ на свой вопрос.
Результат XOR не может быть больше 0xFFFF. Спасибо.
Как вы это понимаете?
Максимальное значение unsigned short может быть только 0xFFFF. Если у нас есть a равно 0xFFFF и b равно 0, то результатом XOR будет 0xFFFF. 16-битный тип данных...
Максимальное значение, которое может содержать unsigned short
, — это не 0xFFFF
, а USHRT_MAX
, значение которого определяется реализацией не меньше 65535
. Следовательно, значение может быть больше. Кроме того, значение INT_MAX
также определяется реализацией и может составлять всего 32767
.
Следовательно, результат зависит от реализации компилятора, верно?
О каком выражении вы спрашиваете, a ^ b
, (a ^ b)
, (a ^ b) > 0
или о чем-то другом?
(а^б). Мне было интересно, может ли случиться так, что результатом этого выражения будет отрицательное число. в этом случае результат выражения ((a^b) > 0) будет ложным.
В (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 short
s, но не как int
s. Его значение не будет превышать 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
беззнакового типа.
Если
INT_MAX
меньше, чемUSHORT_MAX
, выражение будет иметь типint
. Следовательно, чтобы иметь минимальный воспроизводимый пример, вам нужно опубликовать соответствующие значения изlimits.h
.