В 64-битной и 32-битной ОС результат разный

В 64-битной и 32-битной ОС результат разный

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

  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 бита. Где не так? пожалуйста поправьте мою мысль ....

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
102
2

Ответы 2

Объявление 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 байт правильно?, какое влияние это оказывает на другой тип указателя ???

user10430594 21.10.2018 08:00

Это изменяет количество печатаемых байтов за раз.

user3344003 21.10.2018 16:15

Другие вопросы по теме