Чтобы понять представление переменной int в памяти на C/C++, ниже приведена базовая программа для создания переменной и ее размера. Обычно значение переменной типа int хранится в серии байтов, которые представляются как представление переменной в виде памяти. В зависимости от используемого оборудования и компилятора переменная int может быть представлена разным количеством байтов.
Пример:
С++
// C++ Program to create a variable and show its size.
#include <iostream>
using
namespace
std;
int
main()
{
int
x = 10;
cout << x << endl;
cout <<
"size of x is : "
<<
sizeof
(x) << endl;
return
0;
}
Выход
10 size of x is : 4
Пояснение к вышеуказанной программе
В приведенной выше программе мы только что создали переменную типа int и присвоили ей значение 10, а затем просто напечатали ее значение и размер переменной в выходной поток. Переменная Int по умолчанию выделяет 4 байта или 32 бита памяти. Из этих 32 бит только один бит является битом знака, а остальные 31 бит являются битами данных (это справедливо только для подписанного целого числа, но в случае беззнакового целого числа все 32 бита являются битами данных, поскольку в нем хранятся только положительные числа). Архитектура переменной int показана ниже.
А | Б | С | Д |
Из этих 32 битов первый бит первого байта является битом знака. если бит со знаком равен 0, то данные, хранящиеся в этих других 31 битах, положительны, но если бит со знаком равен 1, то данные отрицательны, поэтому компьютер будет преобразовывать сохраненные данные в дополнение до 2 при доступе к ним.
Как данные хранятся в 32-битном?
Предположим, нам нужно хранить 10 в памяти. Во-первых, нам нужно преобразовать 10 в 32-битный двоичный файл. Двоичное значение 10 (десятичное) равно 1010. Теперь, чтобы преобразовать его в 32-битное двоичное, добавьте 28 нулей перед 1010.
10 (decimal) = 00000000 00000000 00000000 00001010 A B C D
Эти 32 бита не будут храниться непосредственно в выделенной 4-байтовой памяти. он будет храниться в соответствии с порядком байтов.
Что такое порядок байтов?
Endianness — это термин, описывающий порядок, в котором последовательность байтов хранится в памяти компьютера. Endianness бывает двух типов:
- Маленький порядок байтов
- Большой порядок следования байтов
1. Маленький порядок байтов
При прямом порядке байты переменных типа int хранятся в обратном порядке (порядок DCBA). Компьютер с микропроцессором с прямым порядком байтов будет работать в соответствии с прямым порядком байтов. пример процессоров с прямым порядком байтов включает Intel, AMD и т. д.
2. Большой порядок следования байтов
В Big endianness байты переменной int хранятся в том же порядке (порядок ABCD). Компьютер с микропроцессором с обратным порядком байтов будет работать в соответствии с обратным порядком байтов. пример процессоров с обратным порядком байтов включает Motrolla, Power PC и т. д. Учитывая наши 4 байта данных как A, B, C и D. эти 4 байта будут храниться в порядке ABCD или порядке DCBA, определяемом последовательностью байтов.
Для процессоров с обратным порядком байтов 10 будет храниться, как показано ниже:
А |
Б |
С |
Д |
Но для процессоров с прямым порядком байтов в памяти будет храниться 10, как показано ниже:
Д |
С |
Б |
А |
Пример:
С++
// C++ Program to Display Bytes of an Integer Variable
#include <iostream>
using
namespace
std;
// Main function
int
main()
{
int
num;
cout <<
"Enter a Number : "
;
cin >> num;
unsigned
char
* p = (unsigned
char
*)#
cout <<
"First Byte of variable num : "
<< *p << endl;
p++;
cout <<
"Second Byte of variable num : "
<< *p << endl;
p++;
cout <<
"Third Byte of variable num : "
<< *p << endl;
p++;
cout <<
"Fourth Byte of variable num : "
<< *p << endl;
return
0;
}
Выход:
// for Big-endian Enter a Number : -534 First Byte of Variable num : 255 Second Byte of Variable num : 255 Third Byte of Variable num : 253 Fourth Byte of Variable num : 234
Выход:
// for Little-endian Enter a Number : -534 First Byte of Variable num : 234 Second Byte of Variable num : 253 Third Byte of Variable num : 255 Fourth Byte of Variable num : 255
(-534)10 = ( 11111111 11111111 11111101 11101010 )2
Выше показано дополнение до 2 числа 534.
Представление памяти согласно Big-endianness:
A |
B |
C |
D |
Представление памяти в соответствии с прямым порядком байтов:
D |
C |
B |
A |
Объяснение
В приведенной выше программе мы просто взяли целочисленную переменную в качестве пользовательского ввода, затем присвоили адрес целочисленной переменной указателю беззнакового символьного типа, который будет указывать только на первый байт целого числа, затем мы печатаем значение указателя и увеличиваем указатель. на единицу, которая будет указывать на второй адрес целочисленной переменной и снова печатать значение, присутствующее во втором байте. Просто повторяйте процесс до последнего или четвертого байта целочисленной переменной. Мы будем получать данные, присутствующие в каждом байте целого числа, по одному отдельно. Если мы получим байты в обратном порядке, то наш компьютер имеет процессор с прямым порядком байтов, в противном случае — процессор с прямым порядком байтов.