В 64-битной и 32-битной ОС у них разные результаты - PullRequest
0 голосов
/ 20 октября 2018

enter image description here

Я хочу убедиться, что моя мысль.

  1. Изображение 32-битное представление (32-битная ОС).Таким образом, каждый массив памяти имеет 32-битную память, поскольку каждая шестнадцатеричная цифра имеет 16 бит.Я прав?

  2. Я не могу полностью понять результат этого кода с точки зрения 64-битной ОС. Правильно ли каждый слот памяти имеет 32-битный и 64-битный в каждой ОС?

    #include <stdio.h>
    
    typedef int *byte_pointer
    
    void show_bytes(byte_pointer start, size_t len){
    int i;
    for(i=0; i<len; i++)
     printf(" |%.2x",start[i]);
    printf("\n");
    }
    
     void show_int(int x){
    show_bytes((byte_pointer) &x, sizeof(int));
    
    }
    
    int main(){
    
    show_int(12345);  //3039 in hexadecimal
    
    }
    

Я думаю, что результат должен быть | 30390000 |...... | ....... | ......

Но результат |3039 |...... | ....... | ...... на самом деле я думал, что int это 4 байта = 32 бита, поэтому он должен печатать 8 цифр в шестнадцатеричном формате, так как одна цифра в шестнадцатеричном формате содержит 4 бита.Где не так?Пожалуйста, исправьте мои мысли ....

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

64-битные и 32-битные обозначают базовую единицу обработки в ЦП.Они не влияют на размер элементов массивов.

Ваше изображение обращается к порядку байтов, что является совершенно другой концепцией.

Если у вас целочисленное значение (шестнадцатеричное) 89AB, которое требует двух байтов, 89 или AB идет туда первым байтом?

Этот ответ зависит от процессора.Некоторые процессоры помещают старший значащий байт первым, так что 89 предшествует AB в памяти.

Некоторые процессоры помещают младший значащий байт в память, так что AB предшествует 89.

(И некоторые процессорынастраиваются так, чтобы операционная система могла выбирать, какой порядок использовать при запуске.)

Изображение представляет собой 32-битное представление (32-битная ОС).Таким образом, каждый массив памяти имеет 32-битную память, поскольку каждая шестнадцатеричная цифра имеет 16 бит.Я прав?

Нет, почти каждый процессор поддерживает целые числа разных размеров.Это изображение может отражать 16-битный, 32-битный, 64-битный ..... процессор.

Я не могу полностью понять результат этого кода с точки зрения 64-битной ОСправильно, каждый слот памяти имеет 32-х и 64-х битный в каждой ОС?

Нет.Все (почти все?) Современные процессоры работают на 8-битных байтах.

Цель вашего примера кода - показать порядок байтов на процессоре.Это не имеет ничего общего с 32-битными и 64-битными за исключением того, что компиляторы склонны использовать для процессора естественный целочисленный размер.Но это зависит от компилятора, а не от процессора.

Вы говорите, что получаете

|39 |30 |00 |00

Я предполагаю, что вы используете Intel или Intel-совместимый процессор.Если вы запустите это на 68000, вы получите

|00 |00 |30 |39
0 голосов
/ 20 октября 2018

Объявление 1: каждая синяя ячейка на изображении представляет ячейку памяти размером 1 байт.Числа имеют 2 шестнадцатеричных числа, потому что максимальное число, которое может быть сохранено в одном байте, равно 255 или FF в шестнадцатеричном формате.Четыре ячейки памяти имеют размер 32 бита, да.

Объявление 2: Нет. Каждый слот памяти имеет 1 байт как в 32-разрядных, так и в 64-разрядных операционных системах.Но целое число хранится в нескольких последовательных ячейках памяти.В 32-битных ОС int обычно хранится в 4 последовательных ячейках памяти, в 64-битных ОС int хранится в 8 последовательных ячейках памяти.Если вы хотите напечатать отдельные ячейки памяти вашего номера, вы должны зациклить массив символов (символ имеет размер 1 байт):

void show_bytes(byte_pointer start, size_t len){
int i;
for(i=0; i<len; i++)
 printf(" |%.2x",((char *)start)[i]);
printf("\n");
}

Это печатает, например:

 |39 |30 |00 |00

Редактировать: размер типа int не указан явно в стандарте C.Это также может быть 4 байта на 64-битной ОС.Если вы хотите использовать 8-байтовые целые числа, вы можете попробовать long long вместо int.

...