Байт, машинное слово
Компьютеры обрабатывают данные, представленные в двоичной системе счисления. Как сказал бы Остап Бендер: "Это медицинский факт". Основа представления любых данных машинное слово. Машинное слово это упорядоченное множество двоичных разрядов, используемое для хранения команд программы и обрабатываемых данных. Каждый разряд, называемый БИТОМ -это двоичное число, принимающее значения только 0 или 1. Разряды в слове обычно нумеруются, справа налево, начиная с 0. Количество разрядов в слове называется размерностью машинного слова или его РАЗРЯДНОСТЬЮ машинного слова.
.
15 14 ... 8 7 5 ... 2 1 0
________________________________________________
1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1
________________________________________________
| | |
старший разряд (бит) 5-й разряд младший разряд
БАЙТ -- машинное слово минимальной размерности, адресуемое в процессе обработки данных.
Размерность байта - 8 бит -принята не только для представления данных в большинстве компьютеров, но и в качестве стандарта для хранения данных на внешних носителях, для передачи данных по каналам связи, для представления текстовой информации. Кроме того, байт является универсальным "измерительным инструментом" - размерность всех форм представления данных устанавливается кратной байту. При этом машинное слово считается разбитым на байты, которые нумеруются, начиная с младших разрядов.
Машинное слово двойной длины ( ДВОЙНОЕ СЛОВО ) используется для увеличения диапазона представления целых чисел. Двойные слова обрабатываются либо отдельными командами процессора, либо программно.
Самая распространенные формы представления данных, использующие одно машинное слово -целое число со знаком и без. Наиболее простая -целое положительное число без знака. В нем каждый разряд машинного слова имеет вес, в два раза больший, чем вес соседнего правого, то есть 1,2,4,8,16 и т.д. или последовательные степени 2. Тогда значение числа в машинном слове равно сумме произведений значений разрядов на их веса:
.
R0 * 1 + R1 * 2 + R2 * 4 + ... + R15 * 32768 или
.
0 1 16
R0 * 2 + R1 * 2 + ... + R15 * 2
Например, машинное слово 0000000001001001 имеет значение 1+8+128 = 137. На практике вместо двоичной системы используются восьмеричная и шестнадцатеричная системы счисления. Это объясняется тем, что одна восьмеричная цифра принимает значения от 0 до 7 и занимает 3 двоичных разряда. Аналогично шестнадцатеричная цифра принимает значения от 0 до 15, что соответствует 4-м двоичным разрядам ( ТЕТРАДА ).
При необходимости представить машинное слово в его "натуральном" виде как последовательность двоичных разрядов лучше всего пользоваться шестнадцатеричными константами. Поскольку обычных цифр для представления значений от 0 до 15 не хватает, то для недостающих используются прописные или строчные латинские буквы:
.
A - 10, D - 13,
B - 11, E - 14,
C - 12, F - 15.
Сама константа содержит ряд шестнадцатеричных цифр, предваренный последовательностью "0x", например:
.
0x1234, 0x1B8C, 0xB8000000, 0xFFFF
Перевести эти константы в двоичную систему очень просто. Достаточно представить каждую цифру в виде четырех двоичных разрядов, задающих ее значение в двоичной системе:
.
0x1B8C = 0001 1011 1000 1100
1 B 8 C
И наоборот, значение любого машинного слова из двоичного представления легко перевести в шестнадцатеричную константу, разбив на тетрады и заменив значение каждой из них соответствующей цифрой 0..9A..F.
Но на самом деле программиста обычно не интересует представление всего слова в виде последовательности битов. По условию поставленной задачи ему требуется иметь установленными в 0 или 1 отдельные биты. Это также очень просто сделать, если считать номера разрядов справа налево по 4 в каждой цифре, начиная с 0. Например, если в константе требуется установить в 1 девятым разряд, то он будет находиться в третьей справа цифре, содержащей разряды с номерами 8..11. Все остальные цифры будут нулевыми. Значение же этой цифры с установленным девятым разрядом будет равно 2.
В результате получим константу 0x0200. Наоборот, если в тетраде установлены в 1 значения всех битов, то ей соответствует цифра F. Тогда машинное слово со всеми единичными разрядами выглядит как 0xFFFF, а с единственным, установленным в 0 девятым разрядом -0xFDFF.
Аналогичным образом могут использоваться восьмеричные константы. В Си любая константа, содержащая цифры от 0 до 7 и начинающаяся с 0, считается восьмеричной, например 0177556.
.
7 Байт 0 Значение в 10-й системе счисления
____________________ 0 2 3 6
0 1 0 0 1 1 0 1 2 + 2 + 2 + 2 = 1+4+8+64 = 77
____________________
.
Восьмеричная константа 0 1 0 0 1 1 0 1
1 1 5 = 0115
.
Шестнадцатеричная константа 0 1 0 0 1 1 0 1
4 13 = 0x4D
.
Байт 1 Байт 0
_______________________________________
0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 0
_______________________________________
0 6 6 7 1 4 = 066714
________________________________________
0 1 1 0 1 1 0 1 1 1 0 0 1 1 0 0
________________________________________
6 13 12 12 = 0x6DCC
Получить значение восьмеричной или шестнадцатеричной константы в десятичной системе можно также путем умножения цифр числа на веса разрядов -последовательные степени 8 или 16:
.
0 1 2 3
0x6DCC =12(C)*16 +12(C)*16 +13(D)*16 +6*16 = 12 + 12*16 + 13*256 + 6*4096
При обнаружении в тексте программы константы транслятор может самостоятельно определить ее размерность (стандартное или двойное машинное слово), исходя из количества значащих цифр. Кроме того, десятичные константы он считает всегда целыми со знаком. Программист может явно указать, что данная константа является "длинной" (символы L,l) или беззнаковой (символы U,u):
.
200 // Целое стандартной размерности
1000000 // Длинная константа
200l, 200L , 0xB8L // Длинные константы
123u, 60000U // Беззнаковые константы
077777777UL // Длинная беззнаковая константа