Какой тип результата?Является ли это возможным? - PullRequest
0 голосов
/ 29 мая 2019

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

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

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

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

Если у нас есть два типа, то результатом выражения с этими типами должен быть старший тип.(int или unsigned int)

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

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

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

В (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, обычные арифметические преобразования *Выполнено 1030 * (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).
1 голос
/ 29 мая 2019

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

(скомментарии:)

Интересно, может ли получиться, что результат [(a^b)] будет отрицательным числом?в этом случае результат выражения ((a ^ b)> 0) будет ложным

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

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

...