знаковый или беззнаковый?
Feb. 22nd, 2018 12:50 pm(эта запись может быть интересна программистам, знающим C/C++)
Во внутреннем форуме на работе кто-то устроил опрос, который просто не могу не украсть:
[Poll #2078582]
Не смотрите в комментарии перед голосованием, там можно обсуждать правильный ответ.
Во внутреннем форуме на работе кто-то устроил опрос, который просто не могу не украсть:
[Poll #2078582]
Не смотрите в комментарии перед голосованием, там можно обсуждать правильный ответ.
no subject
Date: 2018-02-22 10:59 am (UTC)Может, есть какой-нибудь стандарт С-2017, в котором употребление знака делает выражение знаковым?
no subject
Date: 2018-02-22 11:01 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2018-02-22 11:07 am (UTC)no subject
Date: 2018-02-22 11:23 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2018-02-23 08:27 pm (UTC)(no subject)
From:no subject
Date: 2018-02-22 11:08 am (UTC)no subject
Date: 2018-02-22 11:11 am (UTC)no subject
Date: 2018-02-22 11:21 am (UTC)http://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion
no subject
Date: 2018-02-22 11:22 am (UTC)no subject
Date: 2018-02-22 11:22 am (UTC)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.
Мило.
no subject
Date: 2018-02-22 11:25 am (UTC)И не говорите, что 16-битных приложений не бывает:)
(no subject)
From:(no subject)
From:no subject
Date: 2018-02-22 12:01 pm (UTC)Так что висящее в воздухе выражение foo + foo все-таки имеет тип unsigned short.
(no subject)
From:(no subject)
From:(no subject)
From: (Anonymous) - Date: 2018-02-22 01:57 pm (UTC) - Expandno subject
Date: 2018-02-22 11:46 am (UTC)unsigned short foo;
foo= 33000;
short a= foo+foo;
В инспекторе вижу:
foo,x: 0x80E8
foo+foo,x: 0x101D0
a: 464
foo: 33000
foo+foo: 66000
Получается, беззнаковое...
no subject
Date: 2018-02-22 12:13 pm (UTC)no subject
Date: 2018-02-22 12:01 pm (UTC)Это должен знать каждый ) [CLion в помощь!]
Date: 2018-02-22 12:09 pm (UTC)Re: Это должен знать каждый ) [CLion в помощь!]
Date: 2018-02-22 03:17 pm (UTC)Брахмагупта нервно переворачивается...
no subject
Date: 2018-02-22 12:16 pm (UTC)ПС: а программистом хорошо бы озаботится качеством своих программ, а не забивать голову схоластикой
no subject
Date: 2018-02-22 05:12 pm (UTC)(no subject)
From:(no subject)
From:Имеет.
From:Re: Имеет.
From:Подходов несколько.
From:Re: Подходов несколько.
From:Re: Подходов несколько.
From:Re: Подходов несколько.
From:Conversion rules
Date: 2018-02-22 12:44 pm (UTC)Но похоже это не так. ОМГ какая клоака прикрыта обычной унарной операцией "++"
Up
Хотя рано паниковать -- ведь в дополнительном коде битовые представления эквивалентны...
ПС
По вопросу:
1. Если sizeof(short) < sizeof(int) => foo+foo signed int
2. Если sizeof(short) == sizeof(int) => foo+foo unsigned int
Re: Conversion rules
Date: 2018-02-22 01:39 pm (UTC)Re: Conversion rules
From:Re: Conversion rules
From:(no subject)
From:RE: Re: Conversion rules
From:Re: Conversion rules
From: (Anonymous) - Date: 2018-02-22 02:14 pm (UTC) - ExpandRe: Conversion rules
From:(no subject)
From:(no subject)
From:no subject
Date: 2018-02-22 03:12 pm (UTC)right answer
Date: 2018-02-22 06:34 pm (UTC)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"
Re: right answer
Date: 2018-02-23 11:52 am (UTC)Re: right answer
From:no subject
Date: 2018-02-22 07:35 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2018-02-22 08:49 pm (UTC)здравый смысл - третий (его и выбрал)
значит верен - первый...
no subject
Date: 2018-02-22 11:15 pm (UTC)(если int != short)?
no subject
Date: 2018-02-23 02:15 am (UTC)если (foo + foo) преобразовать обратно в unsigned short, то результат будет правильный результат unsigned short-арифметики.
если тип foo - short, то же самое.
(no subject)
From:no subject
Date: 2018-02-23 03:07 am (UTC)no subject
Date: 2018-02-23 11:48 am (UTC)$ 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 iSigned int.
no subject
Date: 2018-02-23 03:33 pm (UTC)http://coliru.stacked-crooked.com/a/742e9a8cca865c91