Представление переменной Int в памяти в C++

Конструктор копирования в C++ Программирование и разработка

Чтобы понять представление переменной 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 будет храниться, как показано ниже:

0 0 0 0 0 0 0 0

А

0 0 0 0 0 0 0 0

         Б

0 0 0 0 0 0 0 0

С

0 0 0 0 1 0 1 0

                          Д

Но для процессоров с прямым порядком байтов в памяти будет храниться 10, как показано ниже:

0 0 0 0 1 0 1 0

Д

0 0 0 0 0 0 0 0

С

0 0 0 0 0 0 0 0

                          Б

0 0 0 0 0 0 0 0

          А

Пример:

С++

// 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:

1 1 1 1 1 1 1 1

A

1 1 1 1 1 1 1 1

      B

1 1 1 1 1 1 0 1

                           C

1 1 1 0 1 0 1 0

D

Представление памяти в соответствии с прямым порядком байтов:

1 1 1 0 1 0 1 0

                       D

1 1 1 1 1 1 0 1

                        C

1 1 1 1 1 1 1 11

B

1 1 1 1 1 1 1 1

A

Объяснение

В приведенной выше программе мы просто взяли целочисленную переменную в качестве пользовательского ввода, затем присвоили адрес целочисленной переменной указателю беззнакового символьного типа, который будет указывать только на первый байт целого числа, затем мы печатаем значение указателя и увеличиваем указатель. на единицу, которая будет указывать на второй адрес целочисленной переменной и снова печатать значение, присутствующее во втором байте. Просто повторяйте процесс до последнего или четвертого байта целочисленной переменной. Мы будем получать данные, присутствующие в каждом байте целого числа, по одному отдельно. Если мы получим байты в обратном порядке, то наш компьютер имеет процессор с прямым порядком байтов, в противном случае — процессор с прямым порядком байтов.

Читайте также:  Как проверить версию Java в Linux Ubuntu?
Оцените статью
bestprogrammer.ru
Добавить комментарий