Приведение типов при bitwise операциях
От: Denn  
Дата: 16.06.03 18:34
Оценка:
    char a; char b; char c;
    c = a | b & c;


MSVC 6.0 при максимальном количестве предупреждений, жалуется
warning C4244: '=' : conversion from 'int' to 'char', possible loss of data

Это ошибка реализации, приводить к int, или так и должно?
Re: Приведение типов при bitwise операциях
От: skyline Россия  
Дата: 16.06.03 19:09
Оценка: -2
Здравствуйте, Denn, Вы писали:

D>
D>    char a; char b; char c;
D>    c = a | b & c;
D>


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
Re[2]: Приведение типов при bitwise операциях
От: Denn  
Дата: 16.06.03 19:33
Оценка:
Здравствуйте, skyline, Вы писали:

S>Это разные типы, у них разный размер, а следовательно, нельзя однозначно конвертировать один в другой, а значит, нужно явное приведение типов.


Не понял, чем char от char отличается? В стандарте сказано, что операторы применяются только к интегральным или перечислимым (enumeration) типам. Char — это интегральный тип.
Зачем преобразовывать в int, да еще и ругаться при обратном преобразовании, если этого не требует стандарт?
Re: Приведение типов при bitwise операциях
От: Андрей Тарасевич Беларусь  
Дата: 16.06.03 20:56
Оценка: 1 (1) +1
Здравствуйте, Denn, Вы писали:

D>
D>    char a; char b; char c;
D>    c = a | b & c;
D>


D> MSVC 6.0 при максимальном количестве предупреждений, жалуется

D>warning C4244: '=' : conversion from 'int' to 'char', possible loss of data

D> Это ошибка реализации, приводить к int, или так и должно?


Так и должно.
Best regards,
Андрей Тарасевич
Re: Приведение типов при bitwise операциях
От: msn  
Дата: 17.06.03 05:49
Оценка: 1 (1) +2
Здравствуйте, Denn, Вы писали:

D>
D>    char a; char b; char c;
D>    c = a | b & c;
D>


D> MSVC 6.0 при максимальном количестве предупреждений, жалуется

D>warning C4244: '=' : conversion from 'int' to 'char', possible loss of data

D> Это ошибка реализации, приводить к int, или так и должно?



По стандарту, операнды бинарного оператора, размер которых меньше int'a приводяться к int'у
до применения оператора. А после, ты приводишь int к char'у.
Все честно
Re[3]: Приведение типов при bitwise операциях
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 17.06.03 14:19
Оценка:
Здравствуйте, Denn, Вы писали:
D> Зачем преобразовывать в int, да еще и ругаться при обратном преобразовании, если этого не требует стандарт?

#include <stdio.h>
int main()
{
  char a; char b; char c;
  printf( "%u\n", sizeof(a | b & c) ); // тип твоего выражения равен int
}
Алексей Кирдин
Re[3]: Приведение типов при bitwise операциях
От: UgN  
Дата: 17.06.03 14:36
Оценка:
Здравствуйте, 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.

Re[4]: Приведение типов при bitwise операциях
От: UgN  
Дата: 17.06.03 14:45
Оценка: 1 (1)
В добавок к выше сказанному и по-русски.

D>> Не понял, чем char от char отличается? В стандарте сказано, что операторы применяются только к интегральным или перечислимым (enumeration)

D>> типам. Char — это интегральный тип.
Да. Но это не все.

D>> Зачем преобразовывать в int, да еще и ругаться при обратном преобразовании, если этого не требует стандарт?

Требует. Так как char это не long double, double и float, то он должен быть приведен к int (integral promotion 4.5).
Причем это же и является типом результата. Поэтому ругань на присваивание char'у int'а совершенно законна.
Re: Приведение типов при bitwise операциях
От: AlexVBibe  
Дата: 17.06.03 14:49
Оценка: -1
Здравствуйте, Denn, Вы писали:

D>
D>    char a; char b; char c;
D>    c = a | b & c;
D>


Нет это не ошибка, тип char имеет размер 8 бит, а компилятор при генерации кода для логических команд использует 32 разрядные регистры, в следствии чего после вычисления выражения a | b & c будет присваивание из 32 разрядного регистра в 8 разрядную переменную, что бы избежать этого соообщения
достаточно написать c = char(a | b & c).
PS: Кстати студия 7.1 уже не генерит никаких сообщений
Re[2]: Приведение типов при bitwise операциях
От: UgN  
Дата: 17.06.03 14:54
Оценка:
Здравствуйте, AlexVBibe, Вы писали:

AVB>Нет это не ошибка, тип char имеет размер 8 бит, а компилятор при генерации кода для логических команд использует 32 разрядные регистры <skipped>


А где связь между разрядностью регистров какого-то процессора и языком С++?
Re: Приведение типов при bitwise операциях
От: Евгений Коробко  
Дата: 17.06.03 15:00
Оценка:
Здравствуйте, Denn, Вы писали:

D>
D>    char a; char b; char c;
D>    c = a | b & c;
D>


D> MSVC 6.0 при максимальном количестве предупреждений, жалуется

D>warning C4244: '=' : conversion from 'int' to 'char', possible loss of data

D> Это ошибка реализации, приводить к int, или так и должно?


На самом деле, Страуструп писал, что преобразование int -> char не должно приводить в ворнингу. Это исключение, сделанное с целью совместимости с С, где такое преобразование применяется очень часто.
Евгений Коробко
Re[2]: Приведение типов при bitwise операциях
От: Павел Кузнецов  
Дата: 17.06.03 16:04
Оценка:
Здравствуйте, Евгений Коробко, Вы писали:

ЕК> На самом деле, Страуструп писал, что преобразование int -> char не

ЕК> должно приводить в ворнингу.

Страуструп писал это о компиляторе CFront, который он делал. Разработчики других
компиляторов вольны принимать свои решения, руководствуясь нуждами своих пользователей.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.