Подробное объяснение хранения целых чисел и чисел с плавающей запятой в памяти (исходный код, дополнительный код, дополнительный код, старший и малый порядок байтов, доступ к числам с плавающей запятой)
Подробное объяснение хранения целых чисел и чисел с плавающей запятой в памяти (исходный код, дополнительный код, дополнительный код, старший и малый порядок байтов, доступ к числам с плавающей запятой)

1. Хранение целых чисел в памяти

Существует три способа представления целых чисел издвоичные.,Прямо сейчасИсходный код, инверсный код, дополнительный код.

Существует три метода представлениязнаковый битиЧисловые битыдве части,Числовые Высшее положение битиз считается знаковым. бит, где 0 означает «положительный», 1 означает «отрицательный», а оставшиеся из битов — числовые. биты。

Для положительного целого числа его исходный код, обратный код и дополнительный код одинаковы.

Для отрицательных целых чисел три метода представления различны: Исходный код:Непосредственное преобразование значений в положительные и отрицательные числаизформа переведена на⼆Зайти в базуизто есть Исходный код обратный код:Воля Исходный кодиззнаковый бит остается неизменным, а остальные биты побитно инвертируются, чтобы получить обратный код дополнять:обратный код+1

Когда компьютер сохраняет целые числа, он сохраняет их дополнение.

Причина в следующем:

1. В компьютерной системе середина,числовое значение⼀закон⽤дополнятьвыражатьихранилище。Причина в том,использоватьдополнять,Можетк Волязнаковый битовые и числовые поля обрабатываются единообразно; 2.в то же время,добавлениеи减法也Можетксистема⼀иметь дело с(В процессоре есть только сумматоры)также,дополнятьи Исходный взаимное преобразование кодов, процесс работы такой же, как и из, никакого дополнительного аппаратного обеспечения не требуется. обеспечениесхема。

2. Порядок байтов с прямым и прямым порядком байтов и оценка порядка байтов.

Ниже мы используем фрагмент кода для наблюдения за хранением данных.

Путем отладки мы можем обнаружить, что число 0x11223344 хранится в байтах в обратном порядке.

Причина в том, что мы понимаем, что порядок, в котором данные хранятся в памяти, связан с большими и малыми сторонами.

2.1 Что такое большой и малый порядок байтов?

Режим Big Endian (хранилище):относится кданныеиз Содержимое младших байтов хранится в Памятьизвысокий адрес,И данные с высокобайтовым содержанием,держать По низкому адресу в памяти. Режим Little Endian (хранилище):относится кданныеиз Содержимое младших байтов хранится в Памятьизнижний адрес,И данные с высокобайтовым содержанием,Сохранено по высокому адресу Памятьиз.

То, что показано выше, представляет собой порядок байтов, хранящийся в режиме прямого порядка байтов.

Мы также можем использовать один конец кода, чтобы определить, какой режим использует наше оборудование для хранения порядка байтов.

Способ первый:

Язык кода:javascript
копировать
#include<stdio.h>
int check()
{
	int i = 1;
	return (*(char*)&i);
}
int main()
{
	int b = check();
	if (b == 1)
		printf("с прямым порядком байтов");
	else
		printf("с прямым порядком байтов");

	return 0;
}

Способ второй:

Язык кода:javascript
копировать
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	union 
	{
		char a;
		int b;
	}u;
	u.b = 1;
	if (u.a == 1)
		printf("с прямым порядком байтов");
	else
		printf("с прямым порядком байтов");

	return 0;
}
2.2 Почему существует большой и малый порядок байтов?

В компьютерных системахсередина,дав байтах из,Каждая единица адреса соответствует байту,⼀байты8bit бит, но в C, кроме 8 bit из char Кроме того, существует 16 bit из short тип, 32 bit из long форме (зависит от конкретного компилятора), кроме того, для процессоров с разрядностью более 8 бит, например 16-битных Или 32-битный процессор, поскольку ширина регистра больше одного байта, должна возникнуть проблема с размещением нескольких байтов. Это приводит к режиму хранилища с прямым порядком байтов и режиму хранилища с прямым порядком байтов. Например: 16бит. из short форма x , в Памятьиз адрес 0x0010 , x Значение из 0x1122 ,Так 0x11 это старший байт, 0x22 это младший байт. Для режима с прямым порядком байтов просто 0x11 размещен по младшему адресу, т.е. 0x0010 середина, 0x22 Разместите его по высокому адресу середина, то есть 0x0011 середина. Режим Little Endian — полная противоположность. Мы обычно используем из X86 Структура имеет прямой порядок байтов, и KEIL C51 Это режим с прямым порядком байтов. Многие изARM и DSP работают в режиме прямого порядка байтов. Некоторые процессоры ARM также могут питаться от аппаратного возможность выбрать режим с прямым порядком байтов или режим с прямым порядком байтов.

3. Хранение чисел с плавающей запятой в памяти.

Сначала посмотрите на следующий фрагмент кода. Каков результат?

Язык кода:javascript
копировать
#include<stdio.h>
int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("nЗначение из:%d\n", n);
	printf("*pFloatЗначение из:%f\n", *pFloat);
	*pFloat = 9.0;
	printf("numЗначение из:%d\n", n);
	printf("*pFloatЗначение из:%f\n", *pFloat);

	return 0;
}

Прежде чем увидеть ответ, можно подумать, что же будет на выходе?

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

Что касается приведенного выше вопроса, то на самом деле речь идет о том, как в Память используются числа с плавающей запятой. Давайте поговорим о том, как работают числа с плавающей запятой в Память.

3.1 Хранение чисел с плавающей запятой

По международным стандартам IEEE (Институт инженеров электротехники и электроники) 754, любое двоичное число V с плавающей запятой можно выразить в следующей форме:

• (−1)^S Указывает знаковый бит. Когда S=0, V является положительным числом, когда S=1, V является отрицательным числом. • M Представляет допустимое число, M больше или равно 1, меньше 2из • 2 ^E Представляет бит экспоненты

Например:

  • Десятичная дробь из5.0, пишется двойной 101.0 , эквивалентный 1.01×2^2 。 Так,Согласно приведенному выше формату Viz,Можно сделать вывод, что S=0,M=1.01,E=2。
  • десятичныйeiz-5.0,написано какbinaryда -101.0 , что эквивалентно -1.01×2^2 . Тогда S=1, M=1,01, E=2.

IEEE 754 предусматривает:

Для 32-битных чисел с плавающей запятой старший из 1 бит — это хранилищезнаковый. битS,Тогда из 8-битного индекса хранилища E,Осталось 23 действительных цифры M

Для 64-битных чисел с плавающей запятой старший из 1 бит — это хранилищезнаковый. битS,Тогда из11 битхранилище с индексом E,Осталось 52 действительных цифры M

3.1.1 Процесс хранения чисел с плавающей запятой

IEEE 754 также имеет некоторые специальные положения для значащей цифры M и показателя степени E.

  • Как я уже говорил, 1≤M<2 , то есть M можно записать как 1.xxxxxx изформа,вxxxxxxПредставляет десятичную часть。 IEEE 754 постановления,При сохранении M внутри компьютера,По умолчанию первая цифра этого номера всегда равна 1.,поэтомуможно отбросить,Сохраняется только следующая часть xxxxxx. Например при сохранении 1.01из,Только сохранить 01,Подождите, пока оно будет прочитано,Затем добавьте первую цифру из1. сделай это,Это экономит 1 значащую цифру. В качестве примера возьмем 32-битные числа с плавающей запятой.,Для M осталось всего 23 бита.,После отбрасывания первой цифры из1,Он равен 24 значащим цифрам, которые можно сохранить.
  • Для показателя E это целое число без знака.
  • Если E равно 8, это,Тогда диапазон его значений составляет 0–255, если E составляет 16 бит;,Тогда диапазон его значений составляет 0–2047. но,Отрицательные числа могут встречаться в научной записи из,такIEEE 754 предусматривает, что при хранении Память необходимо прибавлять истинное значение Еиз. ⼀среднее число,Для 8-битного изE,Среднее число — 127.Для 11 цифр изE это среднее число равно 1023.。например,2^10изEда 10, поэтому при сохранении его как 32-битного числа с плавающей запятой его необходимо сохранить как 10+127=137, что равно 10001001.
3.1.2 Процесс получения чисел с плавающей запятой

Есть три ситуации, когда индекс E извлекается из памяти:

E не все 0 или не все 1

Расчетное значение показателя степени Eиз плюс 127 (или 1023),получить истинную ценность,Затем добавьте 1 перед значащими цифрами.

Например,0.5издвоичныйформа0.1,Поскольку целая часть должна быть 1,Таким образом, десятичная точка перемещается на одну позицию вправо.,Тогда это 1,0*2^(-1),Его код экспоненты: -1+127 (среднее значение) = 126.,Представлено как 01111110,Мантисса 1.0 удаляет целую часть и становится 0.,Введите цифры от 0 до 23.,Его двойной выражается как

0 01111110 00000000000000000000000

Е все 0

В это время,Число с плавающей запятой из показателя E равно 1-127 (или 1-1023), что является действительным значением.,Действительная цифра M больше не добавляется к первой цифре из1,Вместо этого оно восстанавливается до десятичного значения 0.xxxxxxiz. Это сделано для представления ±0,и очень мал из чисел, близких к 0из.

Е все 1

В этот момент, если все значащие цифры M равны 0, это означает ±бесконечность (знаковый бит зависит от знакового бита s);

3.2 Анализ

Возвращаясь к затронутой ранее теме,

  • Почему 9 становится 0,000000 при уменьшении до числа с плавающей запятой?

Сначала посмотрим, что такое 9 хранилище в Памятьиз

0000 0000 0000 0000 0000 0000 0000 1001

Затем измените 9 Издвоичная последовательность разбивается в виде чисел с плавающей запятой, чтобы получить первые знаки. бит s=0, следующие 8 цифр являются показателем степени E=00000000 , Последние 23 значащие цифры: M=000. 0000 0000 0000 0000 1001。

Поскольку индекс Е все 0,Следовательно, это соответствует ситуации, когда E все равно 0из. поэтому,Число V с плавающей запятой записывается как:

V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)

очевидно,V — очень маленькое положительное число, близкое к 0из.,такиспользоватьдесятичный Десятичный дисплейто есть0.000000

  • Что касается float 9.0, почему целое число печатается как 1091567616?

Прежде всего, число с плавающей запятой 9,0 равно двоичному числу 1001,0, которое преобразуется в экспоненциальное представление: 1,001×2^3.

Итак: 9,0 = (−1) ∗ (1,001) ∗ 2^3 ,

S=0,E=3+127=130,M=1,001 (при сохранении отбросьте первую 1, а затем используйте 0, чтобы дополнить оставшиеся 23 цифры)

Наконец, записанное в двоичной форме, это

0 10000010 001 0000 0000 0000 0000 0000

Это 32-битное издвоичное число,При использовании как целое число,Это целое число в Памятьиздополнять,Исходный кодExactly 1091567616 。

3.3 Проверка метода хранения чисел с плавающей запятой

к5.5Например,Его издвоичный выражается как 101,1.,Это 1,011*2^2,Тогда S=0,M=1.011,E=2+127=129,

Наконец, записанное в двоичной форме, это:

0 10000001 01100000000000000000000

____________________

⭐Спасибо, что прочитали,Надеюсь, эта статья может быть вам полезна. Если вам нравится мой контент,Не забудьте поставить лайк в избранное в моем блоге,Я продолжу делиться контентом. ⭐

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose