9. Приложения 9.1. Таблица приоритетов операций языка C++ Операции, расположенные выше, имеют больший приоритет.
Здесь "*" и "&" в строке 2 - это адресные операции; в строке 2 "+" и "-" - унарные; "&" в строке 9 - это побитное "и"; "(typecast)" - приведение типа; "new" и "delete" операторы управления памятью в C++. Ассоциативность Left to right (слева направо) означает группировку операторов таким образом: A1 @ A2 @ A3 это ((A1 @ A2) @ A3)Ассоциативность Rigth to left (справа налево) это A1 @ A2 @ A3 это (A1 @ (A2 @ A3)) 9.2. Правила преобразований типов 9.2.1. В выражениях.
При вызове функций их аргументы - тоже выражения, поэтому в них приводятся char,short к int и float к double. Это говорит о том, что аргументы (формальные параметры) функций можно всегда объявлять как int и double вместо char,short и float соответственно. Зато спецификатор unsigned является существенным. 9.2.2. В присваиваниях.op = expr; Тип выражения expr приводится к типу левой части - op. При этом возможны приведения более "длинного" типа к более "короткому" при помощи усечения, вроде: int --> char обрубается старший байт. long --> int обрубается старшее слово. float --> int отброс дробной части double --> int и обрубание мантиссы, если не лезет. double --> float округление дробной части.Вот еще некоторые приведения типов: signed --> unsigned виртуально (просто знаковый бит unsigned --> signed считается значащим или наоборот). unsigned int --> long добавление нулей слева. int --> long расширение знакового бита. float --> int преобразование внутреннего int --> float представления: машинно зависимо.Некоторые преобразования могут идти в несколько стадий, например: char --> long это char --> int --> long char --> unsigned long это char --> int --> unsigned long 9.3. Таблица шестнадцатеричных чисел (HEX)
9.4. Таблица степеней двойки
9.5. Двоичный код: внутреннее представление целых чисел Целые числа в большинстве современных компьютеров представлены в виде двоичного кода. Пусть машинное слово состоит из 16 бит. Биты нумеруются справа налево начиная с 0. Обозначим условно бит номер i через b[i]. Значением его может быть либо 0, либо 1. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | 0| 0| 0| 0| 1| 0| 1| 1| 0| 1| 1| 0| 1| 1| 0| 0| +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+Тогда unsigned число, записанное в слове, равно d = 2**15 * b[15] + 2**14 * b[14] + ... 2**1 * b[1] + b[0];(2**n - это 2 в степени n). Такое разложение числа d единственно. При сложении двух чисел биты складываются по правилам: 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 и перенос 1 в разряд слеваЧисла со знаком интерпретируются чуть иначе. Бит b[15] считается знаковым: 0 - число положительно или равно нулю, 1 - отрицательно. Отрицательные числа хранятся в виде дополнительного кода: -a = ~a + 1Например: 2 = 0000000000000010 ~2 = 1111111111111101 ~2+1 = 1111111111111110 = -2 -1 = 1111111111111111 -2 = 1111111111111110 -3 = 1111111111111101 -4 = 1111111111111100 -5 = 1111111111111011Такое представление выбрано исходя из правила a + (-a) = 0 знак| 2 = 0|000000000000010 сложим их -2 = 1|111111111111110 ---------|--------------сумма: 10|000000000000000Как видим, произошел перенос 1 в бит номер 16. Но слово содержит лишь биты 0..15 и бит b[16] просто игнорируется. Получается, что сумма равна 0000000000000000 = 0что и требовалось. В двоичном коде вычитание реализуется по схеме a - b = a + (-b) = a + (~b + 1) Восьмеричные числа соответствуют разбиению двоичного числа на группы по 3 бита и записи каждой группы в виде соответствующей восьмеричной цифры (смотри таблицу выше). Шестнадцатеричные числа соответствуют разбиению на группы по 4 бита (nibble): x = 0010011111011001 число: 0010 0111 1101 1001 16-ричное: 0x 2 7 D 9 = 0x27D9 число: 0 010 011 111 011 001 8-ричное: 0 0 2 3 7 3 1 = 023731 [Назад][Содержание][Вперед] |