"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу автораИспользование unsigned вместо int с тем, чтобы получить еще один
бит для представления положительных целых, почти никогда не оказывается хорошей идеей. Попытки гарантировать то, что некоторые значения положительны, посредством описания переменных как - стр 54 - unsigned, обычно срываются из-за правил неявного преобразования. Например: unsigned surprise = -1; допустимо (но компилятор обязательно сделает предупреждение). 2.3.2 Неявное Преобразование Типа Основные типы можно свободно сочетать в присваиваниях и выражениях. Везде, где это возможно, значения преобразуются так, чтобы информация не терялась. Точные правила можно найти в #с.6.6. Существуют случаи, в которых информация может теряться или искажаться. Присваивание значения одного типа переменной другого типа, представление которого содержит меньшее число бит, неизбежно является источником неприятностей. Допустим, например, что следующая часть программы выполняется на машине с двоичным дополнительным предсталением целых и 8-битовыми символами: int i1 = 256+255; char ch = i1 // ch == 255 int i2 = ch; // i2 == ? В присваивании ch=i1 теряется один бит (самый значимый!), и ch будет содержать двоичный код "все-единицы" (т.е. 8 единиц); при присваивании i2 это никак не может превратиться в 511! Но каким же может быть значение i2? На DEC VAX, где char знаковые, ответ будет -1; на AT&T 3B-20, где char беззнаковые, ответ будет 255. В C++ нет динамического (т.е. действующего во время исполнения) механизма для разрешения такого рода проблемм, а выяснение на стадии компиляции вообще очень сложно, поэтому программист должен быть внимателен. 2.3.3 Производные Типы Другие типы модно выводить из основных типов (и типов, определенных пользователем) посредством операций описания: * указатель & ссылка [] вектор () функция и механизма определения структур. Например: |
|
|