Биты, байты и числа. Уменьшить размер байта

Это могут быть очень простые вопросы архитектуры низкого уровня. Я пытаюсь понять это. Пожалуйста, поправьте, если я тоже ошибаюсь.

Слово = 64 бита, 32 бита и т. д. Это количество битов, которое компьютер может прочитать за раз.

Вопросы:

1.) Означает ли это, что мы можем отправить 4 числа (длиной 8 бит/байт каждое) для 32 бит? Или комбинация 8-битных (байтовых), 32-битных (4 байта) и т. д. чисел одновременно?

2.) Если нам нужно отправить только 8-битное число, то как оно образует слово? Заполняется только первый байт, а остальные все байты дополняются нулями или последний байт заполняется, а остальные байты дополняются нулями? Или я где-то видел, что первый байт имеет информацию о том, как заполняются остальные байты. Здесь это применимо? Например, UTF-8. Здесь ASCII занимает 1 байт, а некоторые другие символы занимают до 4 байт. Итак, когда мы отправляем один символ, мы отправляем все 4 байта вместе, но заполняем байты, как требуется для символа, а остальные байты равны 0?

3.) Теперь, чтобы представить 8-значное число, нам потребуется 27 бит (помните известный вопрос, сортировка 1 миллиона 8-значных чисел всего с 1 МБ ОЗУ). Можем ли мы точно использовать 27 бит, что составляет 32 бита (4 байта) - 5 бит? и использовать эти 5 цифр для чего-то еще?

Ценю ваши ответы!


person Kevin Rave    schedule 30.10.2012    source источник


Ответы (2)


Думаю, здесь требуется уточнение по 2 пунктам:
1. Адресация памяти.
2. Word

Память может быть адресована двумя способами: обычно она адресуется либо по байтам, либо по словам. Память с байтовой адресацией означает, что каждому байту присваивается отдельный адрес.
a -> 0-й байт
b -> 1-й байт
Память с адресацией по словам те, в которых каждая группа байтов, ширина которой равна слову, получает адрес. Например, если длина слова составляет 32 бита:
a->0-й байт
b->4-й байт
И так далее.

Слово
Я бы сказал, что слово определяет максимальное количество битов, которое процессор может обработать за раз. Например, для 8086 это 16. Обычно это наибольшее число, над которым процессор может выполнять арифметические действия. Продолжая пример, 8086 может выполнять операции с 16-битными числами за раз.

Сейчас попробую ответить на вопросы:

1.) Означает ли это, что мы можем отправить 4 числа (длиной 8 бит/байт каждое) для 32 бит? Или комбинация 8-битных (байтовых), 32-битных (4 байта) и т. д. чисел одновременно?

Вы всегда можете определить собственную интерпретацию набора битов.

Например, если он адресуется по байтам, мы можем обрабатывать каждый байт отдельно и, таким образом, мы можем написать код на уровне сборки, который обрабатывает каждый байт как отдельное 8-битное число. Если это не так, вы можете использовать битовые операции для извлечения отдельных байтов.
Дело в том, что вы можете представить 4 8-битных числа в 32 битах.

2) В основном оставшиеся значащие биты заполнены нулями (для беззнаковых чисел)

3.) Теперь, чтобы представить 8-значное число, нам потребуется 27 бит (помните известный вопрос, сортировка 1 миллиона 8-значных чисел всего с 1 МБ ОЗУ). Можем ли мы точно использовать 27 бит, что составляет 32 бита (4 байта) - 5 бит? и использовать эти 5 цифр для чего-то еще?

Да, вы также можете сделать это. Но вы знаете великий компромисс между пространством и временем. Вы обязательно сэкономите 5 бит на число. Но вам нужно будет использовать битовые операции и все действительно классные, но трудные для чтения вещи. Ускорение времени и усложнение кода.
Но я не думаю, что вы когда-нибудь столкнетесь с ситуацией, когда вам понадобится такой уровень экономии, если только вы не пишете код для очень ограниченной системы. (встроенный и т.д.)

person axiom    schedule 30.10.2012

1- Да, четыре 8-битных целых числа могут поместиться в 32-битное целое число. Это можно сделать с помощью побитовых операций, например (используя операторы C):

((a & 255) << 24) | ((b & 255) << 16) | ((c & 255) << 8) | (d & 255)

В этом примере используются операторы C, но они также используются с той же целью в нескольких других языках (см. ниже — полную компилируемую версию этого примера на C). Вы можете найти побитовые операторы И (&), ИЛИ (|) и Сдвиг влево (<<);

2- Неиспользуемые биты обычно равны 0. Первый байт иногда используется для представления типа кодировки (поищите «магические числа»), но это зависит от реализации. Иногда это разное количество бит.

3- Группы 8-значных чисел могут быть сжаты, чтобы каждая из них использовала только 27 бит. Это очень похоже на пример, за исключением количества битов и размера данных. Для этого вам понадобятся 864-битные группы, т.е. 27 32-битных целых чисел для хранения 32 27-битных чисел. Это будет сложнее, чем пример, но в нем будут использоваться те же принципы.


Полный, компилируемый пример на C:

#include <stdio.h>

/*Compresses four integers containing one byte of data in the least
 *significant byte into a single 32-bit integer*/
__int32 compress(int a, int b, int c, int d){
   __int32 compressed = ((a & 255) << 24) | ((b & 255) << 16) |
      ((c & 255) << 8) | (d & 255);
   return compressed;
}

/*Test the compress() function and print the resuts*/
int main(){
   printf("%x\n", (unsigned)compress(255, 0, 255, 0));
   printf("%x\n", (unsigned)compress(192, 168, 0, 255));
   printf("%x\n", (unsigned)compress(84, 94, 255, 2));
   return 0;
}
person ctype.h    schedule 31.10.2012