D> MSVC 6.0 при максимальном количестве предупреждений, жалуется D>warning C4244: '=' : conversion from 'int' to 'char', possible loss of data
D> Это ошибка реализации, приводить к int, или так и должно?
Это разные типы, у них разный размер, а следовательно, нельзя однозначно конвертировать один в другой, а значит, нужно явное приведение типов.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Здравствуйте, skyline, Вы писали:
S>Это разные типы, у них разный размер, а следовательно, нельзя однозначно конвертировать один в другой, а значит, нужно явное приведение типов.
Не понял, чем char от char отличается? В стандарте сказано, что операторы применяются только к интегральным или перечислимым (enumeration) типам. Char — это интегральный тип.
Зачем преобразовывать в int, да еще и ругаться при обратном преобразовании, если этого не требует стандарт?
D> MSVC 6.0 при максимальном количестве предупреждений, жалуется D>warning C4244: '=' : conversion from 'int' to 'char', possible loss of data
D> Это ошибка реализации, приводить к int, или так и должно?
D> MSVC 6.0 при максимальном количестве предупреждений, жалуется D>warning C4244: '=' : conversion from 'int' to 'char', possible loss of data
D> Это ошибка реализации, приводить к int, или так и должно?
По стандарту, операнды бинарного оператора, размер которых меньше int'a приводяться к int'у
до применения оператора. А после, ты приводишь int к char'у.
Все честно
Здравствуйте, Denn, Вы писали:
D> Не понял, чем char от char отличается? В стандарте сказано, что операторы применяются только к интегральным или перечислимым (enumeration) типам. Char — это интегральный тип. D> Зачем преобразовывать в int, да еще и ругаться при обратном преобразовании, если этого не требует стандарт?
5/9
Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield
result types in a similar way. The purpose is to yield a common type, which is also the type of the result.
This pattern is called the usual arithmetic conversions, which are defined as follows:
If either operand is of type long double, the other shall be converted to long double.
— Otherwise, if either operand is double, the other shall be converted to double.
— Otherwise, if either operand is float, the other shall be converted to float. — Otherwise, the integral promotions (4.5) shall be performed on both operands.
В добавок к выше сказанному и по-русски.
D>> Не понял, чем char от char отличается? В стандарте сказано, что операторы применяются только к интегральным или перечислимым (enumeration) D>> типам. Char — это интегральный тип.
Да. Но это не все.
D>> Зачем преобразовывать в int, да еще и ругаться при обратном преобразовании, если этого не требует стандарт?
Требует. Так как char это не long double, double и float, то он должен быть приведен к int (integral promotion 4.5).
Причем это же и является типом результата. Поэтому ругань на присваивание char'у int'а совершенно законна.
Нет это не ошибка, тип char имеет размер 8 бит, а компилятор при генерации кода для логических команд использует 32 разрядные регистры, в следствии чего после вычисления выражения a | b & c будет присваивание из 32 разрядного регистра в 8 разрядную переменную, что бы избежать этого соообщения
достаточно написать c = char(a | b & c).
PS: Кстати студия 7.1 уже не генерит никаких сообщений
Здравствуйте, AlexVBibe, Вы писали:
AVB>Нет это не ошибка, тип char имеет размер 8 бит, а компилятор при генерации кода для логических команд использует 32 разрядные регистры <skipped>
А где связь между разрядностью регистров какого-то процессора и языком С++?
D> MSVC 6.0 при максимальном количестве предупреждений, жалуется D>warning C4244: '=' : conversion from 'int' to 'char', possible loss of data
D> Это ошибка реализации, приводить к int, или так и должно?
На самом деле, Страуструп писал, что преобразование int -> char не должно приводить в ворнингу. Это исключение, сделанное с целью совместимости с С, где такое преобразование применяется очень часто.
Здравствуйте, Евгений Коробко, Вы писали:
ЕК> На самом деле, Страуструп писал, что преобразование int -> char не ЕК> должно приводить в ворнингу.
Страуструп писал это о компиляторе CFront, который он делал. Разработчики других
компиляторов вольны принимать свои решения, руководствуясь нуждами своих пользователей.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен