Существует три способа представления целых чисел издвоичные.,Прямо сейчасИсходный код, инверсный код, дополнительный код.
Существует три метода представлениязнаковый битиЧисловые битыдве части,Числовые Высшее положение битиз считается знаковым. бит, где 0 означает «положительный», 1 означает «отрицательный», а оставшиеся из битов — числовые. биты。
Для положительного целого числа его исходный код, обратный код и дополнительный код одинаковы.
Для отрицательных целых чисел три метода представления различны: Исходный код:Непосредственное преобразование значений в положительные и отрицательные числаизформа переведена на⼆Зайти в базуизто есть Исходный код обратный код:Воля Исходный кодиззнаковый бит остается неизменным, а остальные биты побитно инвертируются, чтобы получить обратный код дополнять:обратный код+1
Когда компьютер сохраняет целые числа, он сохраняет их дополнение.
Причина в следующем:
1. В компьютерной системе середина,числовое значение⼀закон⽤дополнятьвыражатьихранилище。Причина в том,использоватьдополнять,Можетк Волязнаковый битовые и числовые поля обрабатываются единообразно; 2.в то же время,добавлениеи减法也Можетксистема⼀иметь дело с(В процессоре есть только сумматоры)также,дополнятьи Исходный взаимное преобразование кодов, процесс работы такой же, как и из, никакого дополнительного аппаратного обеспечения не требуется. обеспечениесхема。
Ниже мы используем фрагмент кода для наблюдения за хранением данных.
Путем отладки мы можем обнаружить, что число 0x11223344 хранится в байтах в обратном порядке.
Причина в том, что мы понимаем, что порядок, в котором данные хранятся в памяти, связан с большими и малыми сторонами.
Режим Big Endian (хранилище):относится кданныеиз Содержимое младших байтов хранится в Памятьизвысокий адрес,И данные с высокобайтовым содержанием,держать По низкому адресу в памяти. Режим Little Endian (хранилище):относится кданныеиз Содержимое младших байтов хранится в Памятьизнижний адрес,И данные с высокобайтовым содержанием,Сохранено по высокому адресу Памятьиз.
То, что показано выше, представляет собой порядок байтов, хранящийся в режиме прямого порядка байтов.
Мы также можем использовать один конец кода, чтобы определить, какой режим использует наше оборудование для хранения порядка байтов.
Способ первый:
#include<stdio.h>
int check()
{
int i = 1;
return (*(char*)&i);
}
int main()
{
int b = check();
if (b == 1)
printf("с прямым порядком байтов");
else
printf("с прямым порядком байтов");
return 0;
}
Способ второй:
#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;
}
В компьютерных системахсередина,дав байтах из,Каждая единица адреса соответствует байту,⼀байты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 также могут питаться от аппаратного возможность выбрать режим с прямым порядком байтов или режим с прямым порядком байтов.
Сначала посмотрите на следующий фрагмент кода. Каков результат?
#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;
}
Прежде чем увидеть ответ, можно подумать, что же будет на выходе?
Я считаю, что, увидев ответ, все должны быть в таком же замешательстве, как и я, когда впервые увидел ответ.
Что касается приведенного выше вопроса, то на самом деле речь идет о том, как в Память используются числа с плавающей запятой. Давайте поговорим о том, как работают числа с плавающей запятой в Память.
По международным стандартам IEEE (Институт инженеров электротехники и электроники) 754, любое двоичное число V с плавающей запятой можно выразить в следующей форме:
• (−1)^S Указывает знаковый бит. Когда S=0, V является положительным числом, когда S=1, V является отрицательным числом. • M Представляет допустимое число, M больше или равно 1, меньше 2из • 2 ^E Представляет бит экспоненты
Например:
IEEE 754 предусматривает:
Для 32-битных чисел с плавающей запятой старший из 1 бит — это хранилищезнаковый. битS,Тогда из 8-битного индекса хранилища E,Осталось 23 действительных цифры M
Для 64-битных чисел с плавающей запятой старший из 1 бит — это хранилищезнаковый. битS,Тогда из11 битхранилище с индексом E,Осталось 52 действительных цифры M
IEEE 754 также имеет некоторые специальные положения для значащей цифры M и показателя степени E.
Есть три ситуации, когда индекс 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);
Возвращаясь к затронутой ранее теме,
Сначала посмотрим, что такое 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。
Прежде всего, число с плавающей запятой 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 。
к5.5Например,Его издвоичный выражается как 101,1.,Это 1,011*2^2,Тогда S=0,M=1.011,E=2+127=129,
Наконец, записанное в двоичной форме, это:
0 10000001 01100000000000000000000
____________________
⭐Спасибо, что прочитали,Надеюсь, эта статья может быть вам полезна. Если вам нравится мой контент,Не забудьте поставить лайк в избранное в моем блоге,Я продолжу делиться контентом. ⭐