?

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:
Страница 1 из 2
<<[1] [2] >>
[User Picture]From: mopexod
2018-02-22 10:59 am
Я боюсь представить себе причины опроса.
Может, есть какой-нибудь стандарт С-2017, в котором употребление знака делает выражение знаковым?
(Ответить) (Thread)
[User Picture]From: avva
2018-02-22 11:01 am
Пока что все ответы на опрос - от наивных, добрых, милых людей, которые думают, что в мире есть справедливость, а в его устройстве - разум.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: unibasil
2018-02-22 11:07 am
Мне кажется, implementation defined — это универсальный и всегда корректный ответ на любой вопрос в области IT. В других областях человеческой деятельности вместо этого говорят it depends. ;)

Edited at 2018-02-22 11:09 (UTC)
(Ответить) (Thread)
[User Picture]From: livelight
2018-02-22 11:23 am
Правильно: "IT depends"!
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: a_konst
2018-02-22 11:08 am
По логике не хватает еще варианта "зависит от стандарта/языка".
(Ответить) (Thread)
[User Picture]From: avva
2018-02-22 11:11 am
В принципе да, но по-моему в данном случае начиная как минимум с C89 и C++98 разницы нет. Возможно и раньше.
(Ответить) (Parent) (Thread)
From: (Anonymous)
2018-02-22 11:21 am
Я так думаю, после гугления, что правильный ответ - implementation defined, потому что prvalues of small integral types (such as char) **may** be converted to prvalues of larger integral types (such as int).

http://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion
(Ответить) (Thread)
From: (Anonymous)
2018-02-22 11:22 am
да, какое счастье, что мне как быдло-vb.net-программисту не нужно про это думать.
(Ответить) (Parent) (Thread)
[User Picture]From: mopexod
2018-02-22 11:22 am
Integral Promotions
The difference between the ANSI C and traditional versions of the conversion rules is that the traditional C rules emphasize preservation of the (un)signedness of a quantity, while ANSI C rules emphasize preservation of its value.

In traditional C, operands of types char, unsigned char, and unsigned short are converted to unsigned int. Operands of types signed char and short are converted to int.

ANSI C converts all char and short operands, whether signed or unsigned, to int. Only operands of type unsigned int , unsigned long, and unsigned long long may remain unsigned.

Мило.
(Ответить) (Thread)
[User Picture]From: vladimir000
2018-02-22 11:25 am
Это в предположении, что int != short. Если int == short, то получим unsigned int, иначе - Int.

И не говорите, что 16-битных приложений не бывает:)
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: victor_chapaev
2018-02-22 11:46 am
Набираю:

unsigned short foo;
foo= 33000;
short a= foo+foo;

В инспекторе вижу:

foo,x: 0x80E8
foo+foo,x: 0x101D0
a: 464
foo: 33000
foo+foo: 66000

Получается, беззнаковое...
(Ответить) (Thread)
[User Picture]From: avva
2018-02-22 12:13 pm
Нет, это у вас знаковый int.
(Ответить) (Parent) (Thread)
[User Picture]From: mtyukanov
2018-02-22 12:01 pm
Ответил implementation defined, но настоящий ответ -- expressions do not really have types.
(Ответить) (Thread)
[User Picture]From: baramin
2018-02-22 12:09 pm

Это должен знать каждый ) [CLion в помощь!]



Edited at 2018-02-22 12:13 (UTC)
(Ответить) (Thread)
From: p_a_s_h_a
2018-02-22 03:17 pm

Re: Это должен знать каждый ) [CLion в помощь!]

Ну, у вашего брата Си-шника и подход к вычитанию и делению...
Брахмагупта нервно переворачивается...
(Ответить) (Parent) (Thread)
[User Picture]From: kuzh
2018-02-22 12:16 pm
Правильный ответ: не имеет значения.
ПС: а программистом хорошо бы озаботится качеством своих программ, а не забивать голову схоластикой

Edited at 2018-02-22 12:45 (UTC)
(Ответить) (Thread)
[User Picture]From: Илья Цыгвинцев
2018-02-22 05:12 pm
Пока вдруг из-за такой хрени не окажется, что бинарную выдачу считать невозможно.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: son_0f_morning
2018-02-22 12:44 pm

Conversion rules

Всегда считал, что инкремент\декремент не требуют правил конвертации.

Но похоже это не так. ОМГ какая клоака прикрыта обычной унарной операцией "++"
Up
Хотя рано паниковать -- ведь в дополнительном коде битовые представления эквивалентны...



ПС
По вопросу:
1. Если sizeof(short) < sizeof(int) => foo+foo signed int
2. Если sizeof(short) == sizeof(int) => foo+foo unsigned int

Edited at 2018-02-22 12:48 (UTC)
(Ответить) (Thread)
[User Picture]From: avva
2018-02-22 01:39 pm

Re: Conversion rules

Верно. А кстати, остались ли какие-то живые архитектуры, в которых sizeof(short int)==sizeof(int)?
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]From: Дмитрий Васильев
2018-02-22 03:12 pm
В 90-х шрифты TrueType на Windows не были совместимы с шрифтами на Маке — из-за того, что на Windows кто-то перемудрил с unsigned short.
(Ответить) (Thread)
From: cohenj
2018-02-22 06:34 pm

right answer

look at http://en.cppreference.com/w/cpp/language/typeid

operator typeid(expression)
returns object of class std::type_info
(which has member function name())

The type_info class is neither CopyConstructible nor CopyAssignable


typeid(foo+foo).name() is "unsigned short"
(Ответить) (Thread)
[User Picture]From: migmit.dreamwidth.org
2018-02-23 11:52 am

Re: right answer

https://avva.livejournal.com/3090909.html?thread=132896733#t132896733
(Ответить) (Parent) (Thread) (Развернуть)
(Удалённый комментарий)
[User Picture]From: vladimir000
2018-02-22 07:35 pm
Небось и кодировку сразу utf? :)
(Ответить) (Parent) (Thread)
(Удалённый комментарий)
[User Picture]From: _hedning_
2018-02-22 08:49 pm
логика подсказывает второй вариант
здравый смысл - третий (его и выбрал)
значит верен - первый...
(Ответить) (Thread)
From: ext_1745607
2018-02-22 11:15 pm
То есть short-арифметика на Си не реализуется никак
(если int != short)?
(Ответить) (Thread)
[User Picture]From: e2pii1
2018-02-23 02:15 am
реализуется:
если (foo + foo) преобразовать обратно в unsigned short, то результат будет правильный результат unsigned short-арифметики.

если тип foo - short, то же самое.

(Ответить) (Parent) (Thread) (Развернуть)
Страница 1 из 2
<<[1] [2] >>