Бьерн Страуструп - Язык программирования С++. Главы 2-4
Страница 9. Неявное преобразование типа



2.3.2  Неявное преобразование типа

В присваивании и выражении основные типы могут совершенно свободно
использоваться совместно. Значения преобразовываются всюду, где
это возможно, таким образом, чтобы информация не терялась. Точные
правила преобразований даны в $$R.4 и $$R.5.4.
   Все-таки есть ситуации, когда информация может быть потеряна или
даже искажена. Потенциальным источником таких ситуаций становятся
присваивания, в которых значение одного типа присваивается значению
другого типа, причем в представлении последнего используется
меньше разрядов. Допустим, что следующие присваивания выполняются
на машине, в которой целые представляются в дополнительном коде, и символ
занимает 8 разрядов:

     int i1 = 256+255;
     char ch = i1        // ch == 255
     int i2 = ch;        // i2 == ?

В присваивании ch=i1 теряется один разряд (и самый важный!), а когда
мы присваиваем значение переменной i2, у переменной ch значение "все
единицы", т.е. 8 единичных разрядов. Но какое значение примет i2? На
машине DEC VAX, в которой char представляет знаковые значения, это будет
-1, а на машине Motorola 68K, в которой char - беззнаковый,
это будет 255. В С++ нет динамических средств  контроля
подобных ситуаций, а контроль на этапе трансляции вообще слишком
сложен, поэтому надо быть осторожными.

 
« Предыдущая статья   Следующая статья »