avva: (Default)
[personal profile] avva
(эта запись может быть интересна программистам, знающим C/C++)

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

[Poll #2078582]

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

Date: 2018-02-22 10:59 am (UTC)
From: [identity profile] mopexod.livejournal.com
Я боюсь представить себе причины опроса.
Может, есть какой-нибудь стандарт С-2017, в котором употребление знака делает выражение знаковым?

Date: 2018-02-22 11:01 am (UTC)
From: [identity profile] avva.livejournal.com
Пока что все ответы на опрос - от наивных, добрых, милых людей, которые думают, что в мире есть справедливость, а в его устройстве - разум.

(no subject)

From: [identity profile] mopexod.livejournal.com - Date: 2018-02-22 11:03 am (UTC) - Expand

(no subject)

From: [identity profile] aosypov.livejournal.com - Date: 2018-02-22 11:25 am (UTC) - Expand

Date: 2018-02-22 11:07 am (UTC)
From: [identity profile] unibasil.livejournal.com
Мне кажется, implementation defined — это универсальный и всегда корректный ответ на любой вопрос в области IT. В других областях человеческой деятельности вместо этого говорят it depends. ;)
Edited Date: 2018-02-22 11:09 am (UTC)

Date: 2018-02-22 11:23 am (UTC)
livelight: (Default)
From: [personal profile] livelight
Правильно: "IT depends"!

(no subject)

From: [identity profile] unibasil.livejournal.com - Date: 2018-02-22 11:33 am (UTC) - Expand

(no subject)

From: [personal profile] livelight - Date: 2018-02-22 11:51 am (UTC) - Expand

Date: 2018-02-23 08:27 pm (UTC)
From: [identity profile] gul-kiev.livejournal.com
Всё не так просто. Бывает ещё undefined behavior, и это существенно отличается от implementation defined. :)

(no subject)

From: [identity profile] unibasil.livejournal.com - Date: 2018-02-25 07:59 am (UTC) - Expand

Date: 2018-02-22 11:08 am (UTC)
From: [identity profile] a-konst.livejournal.com
По логике не хватает еще варианта "зависит от стандарта/языка".

Date: 2018-02-22 11:11 am (UTC)
From: [identity profile] avva.livejournal.com
В принципе да, но по-моему в данном случае начиная как минимум с C89 и C++98 разницы нет. Возможно и раньше.

Date: 2018-02-22 11:21 am (UTC)
From: (Anonymous)
Я так думаю, после гугления, что правильный ответ - 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

Date: 2018-02-22 11:22 am (UTC)
From: (Anonymous)
да, какое счастье, что мне как быдло-vb.net-программисту не нужно про это думать.

Date: 2018-02-22 11:22 am (UTC)
From: [identity profile] mopexod.livejournal.com
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.

Мило.

Date: 2018-02-22 11:25 am (UTC)
vladimir000: (Default)
From: [personal profile] vladimir000
Это в предположении, что int != short. Если int == short, то получим unsigned int, иначе - Int.

И не говорите, что 16-битных приложений не бывает:)

(no subject)

From: [identity profile] mopexod.livejournal.com - Date: 2018-02-22 11:27 am (UTC) - Expand

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2018-02-22 12:14 pm (UTC) - Expand

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

Так что висящее в воздухе выражение foo + foo все-таки имеет тип unsigned short.

(no subject)

From: [identity profile] avva.livejournal.com - Date: 2018-02-22 12:14 pm (UTC) - Expand

(no subject)

From: [identity profile] leonov.livejournal.com - Date: 2018-02-22 12:20 pm (UTC) - Expand

(no subject)

From: (Anonymous) - Date: 2018-02-22 01:57 pm (UTC) - Expand

Date: 2018-02-22 11:46 am (UTC)
From: [identity profile] victor-chapaev.livejournal.com
Набираю:

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

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

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

Получается, беззнаковое...

Date: 2018-02-22 12:13 pm (UTC)
From: [identity profile] avva.livejournal.com
Нет, это у вас знаковый int.

Date: 2018-02-22 12:01 pm (UTC)
From: [identity profile] mtyukanov.livejournal.com
Ответил implementation defined, но настоящий ответ -- expressions do not really have types.
From: [identity profile] p-a-s-h-a.livejournal.com
Ну, у вашего брата Си-шника и подход к вычитанию и делению...
Брахмагупта нервно переворачивается...

Date: 2018-02-22 12:16 pm (UTC)
kuzh: (Default)
From: [personal profile] kuzh
Правильный ответ: не имеет значения.
ПС: а программистом хорошо бы озаботится качеством своих программ, а не забивать голову схоластикой
Edited Date: 2018-02-22 12:45 pm (UTC)

Date: 2018-02-22 05:12 pm (UTC)
From: [identity profile] Илья Цыгвинцев (from livejournal.com)
Пока вдруг из-за такой хрени не окажется, что бинарную выдачу считать невозможно.

(no subject)

From: [personal profile] kuzh - Date: 2018-02-23 07:10 am (UTC) - Expand

(no subject)

From: [identity profile] Илья Цыгвинцев - Date: 2018-02-23 03:08 pm (UTC) - Expand

Имеет.

From: [identity profile] son-0f-morning.livejournal.com - Date: 2018-02-23 10:09 am (UTC) - Expand

Re: Имеет.

From: [personal profile] kuzh - Date: 2018-02-23 10:16 am (UTC) - Expand

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

From: [personal profile] kuzh - Date: 2018-02-26 12:23 pm (UTC) - Expand

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

From: [personal profile] kuzh - Date: 2018-02-26 12:55 pm (UTC) - Expand

Conversion rules

Date: 2018-02-22 12:44 pm (UTC)
From: [identity profile] son-0f-morning.livejournal.com
Всегда считал, что инкремент\декремент не требуют правил конвертации.

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



ПС
По вопросу:
1. Если sizeof(short) < sizeof(int) => foo+foo signed int
2. Если sizeof(short) == sizeof(int) => foo+foo unsigned int
Edited Date: 2018-02-22 12:48 pm (UTC)

Re: Conversion rules

Date: 2018-02-22 01:39 pm (UTC)
From: [identity profile] avva.livejournal.com
Верно. А кстати, остались ли какие-то живые архитектуры, в которых sizeof(short int)==sizeof(int)?

Re: Conversion rules

From: [identity profile] son-0f-morning.livejournal.com - Date: 2018-02-22 01:53 pm (UTC) - Expand

Re: Conversion rules

From: [identity profile] avva.livejournal.com - Date: 2018-02-22 01:56 pm (UTC) - Expand

(no subject)

From: [identity profile] levtsn.livejournal.com - Date: 2018-02-22 02:12 pm (UTC) - Expand

RE: Re: Conversion rules

From: [identity profile] gul-kiev.livejournal.com - Date: 2018-02-23 08:38 pm (UTC) - Expand

Re: Conversion rules

From: (Anonymous) - Date: 2018-02-22 02:14 pm (UTC) - Expand

Re: Conversion rules

From: [identity profile] avva.livejournal.com - Date: 2018-02-22 02:24 pm (UTC) - Expand

(no subject)

From: [identity profile] moon-aka-sun.livejournal.com - Date: 2018-02-22 11:40 pm (UTC) - Expand

(no subject)

From: [identity profile] son-0f-morning.livejournal.com - Date: 2018-02-26 11:47 am (UTC) - Expand

Date: 2018-02-22 03:12 pm (UTC)
From: [identity profile] Дмитрий Васильев (from livejournal.com)
В 90-х шрифты TrueType на Windows не были совместимы с шрифтами на Маке — из-за того, что на Windows кто-то перемудрил с unsigned short.

right answer

Date: 2018-02-22 06:34 pm (UTC)
From: [identity profile] cohenj.livejournal.com
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"
(deleted comment)

Date: 2018-02-22 07:35 pm (UTC)
vladimir000: (Default)
From: [personal profile] vladimir000
Небось и кодировку сразу utf? :)
(deleted comment)

(no subject)

From: [personal profile] vladimir000 - Date: 2018-02-22 08:26 pm (UTC) - Expand

(no subject)

From: [identity profile] oļeg giŗko - Date: 2018-02-23 01:41 am (UTC) - Expand

(no subject)

From: [identity profile] berezovsky.livejournal.com - Date: 2018-02-23 05:48 am (UTC) - Expand

(no subject)

From: [identity profile] bopstr.livejournal.com - Date: 2018-02-24 02:15 am (UTC) - Expand

(no subject)

From: [identity profile] archaicos.livejournal.com - Date: 2018-02-24 08:19 pm (UTC) - Expand

Date: 2018-02-22 08:49 pm (UTC)
From: [identity profile] http://users.livejournal.com/_hedning_/
логика подсказывает второй вариант
здравый смысл - третий (его и выбрал)
значит верен - первый...

Date: 2018-02-22 11:15 pm (UTC)
From: [identity profile] caztd.livejournal.com
То есть short-арифметика на Си не реализуется никак
(если int != short)?

Date: 2018-02-23 02:15 am (UTC)
From: [identity profile] e2pii1.livejournal.com
реализуется:
если (foo + foo) преобразовать обратно в unsigned short, то результат будет правильный результат unsigned short-арифметики.

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

(no subject)

From: [identity profile] caztd.livejournal.com - Date: 2018-02-23 05:34 pm (UTC) - Expand

Date: 2018-02-23 03:07 am (UTC)
From: [identity profile] occuserpens.livejournal.com
Интуитивно, плюсы от unsigned int должны быть unsigned int. И действительно, судя по http://www.cplusplus.com/forum/beginner/8529/ так оно и есть, если, конечно, не углубляться в теологические тонкости.

Date: 2018-02-23 11:48 am (UTC)
migmit: (Default)
From: [personal profile] migmit (from livejournal.com)
$ cat test.cpp; g++ test.cpp -o test; ./test
#include 
int main() {
  unsigned short f = 1;
  unsigned int i = 1;
  signed short s = 1;
  signed int j = 1;
  std::cout << typeid(f).name() << std::endl;
  std::cout << typeid(i).name() << std::endl;
  std::cout << typeid(s).name() << std::endl;
  std::cout << typeid(j).name() << std::endl;
  std::cout << typeid(f+f).name() << std::endl;
}
t
j
s
i
i

Signed int.

Date: 2018-02-23 03:33 pm (UTC)
From: [identity profile] serge kork (from livejournal.com)
Действительно GCC продвигает до int.



http://coliru.stacked-crooked.com/a/742e9a8cca865c91

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
2829 30 31   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 12:53 pm
Powered by Dreamwidth Studios