?

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: son_0f_morning
2018-02-23 10:09 am

Имеет.

При делении дополнительный код не обеспечивает бинарную эквивалентнлсть.

Например:
uint / (ushort + ushort
(Ответить) (Parent) (Thread)
[User Picture]From: kuzh
2018-02-23 10:16 am

Re: Имеет.

Это понятно.
Я считаю, что хороший программист сам должен об этом подумать, и при необходимости явным образом указать приведение типа, а не надеяться на стандарты и особенности реализации. Кстати, это положительно скажется на читабельности программы.
Я так и делаю.
(Ответить) (Parent) (Thread)
[User Picture]From: son_0f_morning
2018-02-26 11:54 am

Подходов несколько.

Извините, что не ответил сразу. С планшета был "не формат".

Ваш подход "один из" (кроме наивных "забить" и "писать 100% контролируя conversion").
Мне боле-менее известны и опробованы следующие:

1. Ваш -- его минус многословность (паразитный синтаксис), за которым начинает теряться семантика.
2. Определить "домены" для работы с типами и работать в этих доменах, переопределив операции. На бумаге хорошо, на практике -- реализация спрятана слишком глубоко. Быстро дописать код зачастую проблематично.
3. Математику проводить в машинных словах (или самом "широком" из возможных доменов) -- пересылка "структуры памяти <=> переменные" содержит оверхэд по коду.

Мне нравится 4й подход.
Мне нравится 3й. О боже мне нужно больше кофе!.

ПС
Ну и в -DUBUG вставлять контроль отсутствия переполнения тоже помогает.


Edited at 2018-02-26 11:55 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: kuzh
2018-02-26 12:23 pm

Re: Подходов несколько.

1. Конечно, всё хорошо в меру, я не предлагаю это делать везде.
Но (имхо) это лучше, чем надеяться на собственное понимание стандартов, а всего не упомнишь.
(Ответить) (Parent) (Thread)
[User Picture]From: son_0f_morning
2018-02-26 12:27 pm

Re: Подходов несколько.

Ага, я мне просто нравится 3й больше чем 1й (я так вас понял, что вы 1й используете).

Оверхэд по коду сравнимый. Но в 3м подходе мы выносим эту чисто техническую семантику отдельно, а в 1м вынуждены писать её прямо в арифметических выражениях.

На мой взгляд у 1го подхода хуже читаемость.
(Ответить) (Parent) (Thread)
[User Picture]From: kuzh
2018-02-26 12:55 pm

Re: Подходов несколько.

Ну разумеется, нужно везде, где только можно, использовать int.
(Ответить) (Parent) (Thread)