как целые числа хранятся в памяти? - PullRequest
3 голосов
/ 21 сентября 2011

Я растерялся, когда читал статью о Big / Little Endian.

Код идет ниже:

#include <iostream>
using namespace std;

int i = 12345678;

int main()
{
    char *p = (char*)&i;  //line-1

    if(*p == 78)  //line-2
        cout << "little endian" << endl;
    if(*p == 12)
        cout << "big endian" << endl;

}

Вопрос:

  1. В строке 1 можно ли выполнить преобразование, используя static_cast<char*>(&i)?

  2. В строке 2, согласно коду, если он имеет младший порядок, то 78 сохраняется в младшем байте, иначе 12 сохраняется в младшем байте. Но я думаю, что i = 12345678; будет храниться в памяти в двоичном виде.

    Если он имеет младший порядок, то последний байт двоичного файла i будет храниться в младшем байте, но я не понимаю, как он может гарантировать, что последний байт i равен 78 * * 1023

    Точно так же, если i = 123;, то двоичный файл i равен 01111011, может ли он гарантировать, что в младшем порядке, 23 хранится в младшем байте?

Ответы [ 4 ]

9 голосов
/ 21 сентября 2011
  1. Я бы предпочел reinterpret_cast.

  2. С прямым порядком байтов и с прямым порядком байтов относиться к способу байты , то есть 8-битные величины, хранятся в памяти, , а не двузначные.Если i имеет значение 0x12345678, то вы можете проверить для 0x78 и 0x12, чтобы определить порядковый номер, поскольку две шестнадцатеричные цифры соответствуют одному байту (на всем оборудовании, для которого я запрограммирован).

4 голосов
/ 21 сентября 2011

Здесь есть две разные концепции:

  1. Числа хранятся в двоичном формате. 8 бит представляют байт, целые числа могут использовать 1,2,4 или даже 8 или 1024 байта в зависимости от платформы, на которой они работают.
  2. Endiannes - это порядок следования байтов в памяти (менее значимый первый - LE или наиболее значимый первый - BE)

Теперь 12345678 - это десятичное число, двоичное представление которого (base2) - 101111000110000101001110. Не так просто проверить, в основном потому, что представление base2 не группируется точно в одну десятичную цифру. (нет целого числа x, так что 2 x дает 10). Шестнадцатеричное число легче установить: 2 4 = 16 и 2 8 = 16 2 = 256.

Таким образом, шестнадцатеричное число 0x12345678 образует байты 0x12-0x34-0x56-0x78. Теперь легко проверить, является ли первый 0x12 или 0x78.

(примечание: шестнадцатеричное представление 12345678 - 0x00BC614E, где 0xBC - 188, 0x61 - 97 и 0x4E - 78)

1 голос
/ 21 сентября 2011
  1. static_cast - это новая альтернатива старомодным броскам в стиле C, но она здесь не подходит; reinterpret_cast - это когда вы полностью меняете тип данных.

  2. Этот код просто не будет работать - байты не содержат четного числа десятичных цифр! Цифры десятичного числа не совпадают один к одному с байтами, хранящимися в памяти. Например, десятичное число 500 может храниться в двух байтах как 0x01F4. «01» означает 256, а «F4» - это еще 244, то есть всего 500. Нельзя сказать, что «5» из «500» находится в одном из этих двух байтов - прямой переписки нет. ,

0 голосов
/ 21 сентября 2011

должно быть

unsigned char* p = (unsigned char*)&i;

Вы не можете использовать static_cast. Только reinterpret_cast.

...