?

Log in

No account? Create an account
По делам сюда приплыл, а не за этим [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

знаковый или беззнаковый? [фев. 22, 2018|12:50 pm]
Anatoly Vorobey
[Tags|]

(эта запись может быть интересна программистам, знающим C/C++)

Во внутреннем форуме на работе кто-то устроил опрос, который просто не могу не украсть:

Опрос #2078582 unsigned short

"foo" is an "unsigned short". Is the expression "foo + foo" signed or unsigned?

signed
36(17.2%)
unsigned
126(60.3%)
implementation defined
47(22.5%)


Не смотрите в комментарии перед голосованием, там можно обсуждать правильный ответ.
СсылкаОтветить

Comments:
[User Picture]From: leonov
2018-02-22 12:01 pm
Integral promotions и integral conversions проводятся не по желанию левой пятки компилятора, а лишь если результат выражения необходимо использовать в ситуации, требующей другой тип. Т.е. в данном случае - если результат нужно было бы передать функции f(int). Или если бы результат участвовал в арифметическом выражении с операндом другого типа.

Так что висящее в воздухе выражение foo + foo все-таки имеет тип unsigned short.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2018-02-22 12:14 pm
Нет, по стандарту они переводятся при любой арифметической операции, вне зависимости от того, что будет происходить с ее результатом.
(Ответить) (Parent) (Thread)
[User Picture]From: leonov
2018-02-22 12:20 pm
Лишь в случае операндов разного типа. Иначе не имело бы смысл различие в реализации переполнения для знаковых и беззнаковых типов:

Overflows
Unsigned integer arithmetic is always performed modulo 2^n where n is the number of bits in that particular integer. E.g. for unsigned int, adding one to UINT_MAX gives ​0​, and subtracting one from ​0​ gives UINT_MAX.
When signed integer arithmetic operation overflows (the result does not fit in the result type), the behavior is undefined: it may wrap around according to the rules of the representation (typically 2's complement), it may trap on some platforms or due to compiler options (e.g. -ftrapv in GCC and Clang), or may be completely optimized out by the compiler.

http://en.cppreference.com/w/cpp/language/operator_arithmetic#Conversions

Edited at 2018-02-22 12:27 (UTC)
(Ответить) (Parent) (Thread)
From: (Anonymous)
2018-02-22 01:57 pm
Вы не туда смотрите.
Начните отсюда https://ideone.com/sT7pg0 а потом ищите объяснение этому.
(Ответить) (Parent) (Thread)