Я хочу убедиться в своих мыслях.
Изображение - 32-битное представление (32-битная ОС). Таким образом, каждый массив памяти имеет 32-битную память, поскольку каждая шестнадцатеричная цифра имеет 16 бит. Я прав?
Я не могу полностью понять результат этого кода с точки зрения 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 бита. Где не так? пожалуйста поправьте мою мысль ....





Объявление 1: каждая синяя ячейка на изображении представляет собой ячейку памяти размером 1 байт. Числа состоят из 2 шестнадцатеричных цифр, поскольку максимальное число, которое может быть сохранено в одном байте, равно 255 или FF в шестнадцатеричном формате. Да, четыре ячейки памяти вместе имеют размер 32 бита.
Объявление 2: Нет. Каждый слот памяти имеет 1 байт, как в 32-битных, так и в 64-битных операционных системах. Но целое число хранится в нескольких последовательных ячейках памяти. В 32-битных ОС int обычно хранится в 4 последовательных ячейках памяти, в 64-битных ОС int хранится в 8 последовательных ячейках памяти. Если вы хотите распечатать отдельные ячейки памяти своего номера, вы должны перебрать массив символов (размер char составляет 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.
64-битные и 32-битные относятся к базовой единице обработки в ЦП. Они не влияют на размер элементов массивов.
Ваше изображение обращается к порядку байтов, что является совершенно другой концепцией.
Если у вас есть целочисленное значение (шестнадцатеричное) 89AB, для которого требуется два байта, входит ли 89 или AB в первый байт?
Этот ответ зависит от процессора. Некоторые процессоры помещают старший байт первым, так что 89 стоит перед AB в памяти.
Некоторые процессоры помещают в память самый младший байт, так что AB стоит перед 89.
(А некоторые процессоры можно настроить так, чтобы операционная система могла выбирать, какой порядок использовать при запуске.)
The picture is 32 bit representation(32 bit OS). So each memory array has 32 bits memory since each hexadecimal digit has 16 bits. Am i right?
Нет, почти каждый процессор поддерживает целые числа разного размера. Это изображение может отражать 16-битный, 32-битный, 64-битный ... процессор.
I can't totally understand result of this code in terms of 64 bit OS Is it right each memory slot has 32 bit and 64 bit in each OS?
Нет. Все (почти все?) Современные процессоры работают с 8-битными байтами.
Цель вашего примера кода - показать порядок байтов на процессоре. Это не имеет ничего общего с 32-битными против 64-битных, ЗА ИСКЛЮЧЕНИЕМ того, что компиляторы обычно используют естественный целочисленный размер для процессора. Но это особенность компилятора, а не процессора.
Вы говорите, что получаете
|39 |30 |00 |00
Я предполагаю, что вы используете процессор, совместимый с Intel или Intel. Если вы запустите это на 68000, вы получите
|00 |00 |30 |39
Это изменяет количество печатаемых байтов за раз.
Интересно, почему у него разные результаты в зависимости от того, typedef int * byte_pointer; или typedef беззнаковый символ * byte_pointer. То же самое с двумя случаями, когда каждая ячейка памяти содержит только 1 байт правильно?, какое влияние это оказывает на другой тип указателя ???