在64位和32位OS中,它们的结果不同

时间:2018-10-20 18:25:29

标签: operating-system byte system typedef bit

enter image description here

我想确保自己的想法。

  1. 图片为32位表示(32位OS)。因此,每个存储阵列都具有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 :(得分:-1)

广告1:图像中的每个蓝色单元代表一个大小为1字节的存储单元。这些数字有2个十六进制数字,因为一个字节可以存储的最大数字为255或FF(十六进制)。四个存储单元的大小总共为32位。

广告2:否。在32位和64位操作系统上,每个内存插槽都有1个字节。但是一个整数存储在几个连续的存储单元中。在32位OS上,通常将int存储在4个连续的存储单元中,在64位OS上,将int存储在8个连续的存储单元中。如果要打印编号的单个存储单元,则必须循环遍历一个char数组(一个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

编辑:C标准中未明确指定int的大小。在64位OS上也可以是4字节。如果要使用8字节整数,可以尝试使用long long代替int

答案 1 :(得分:-1)

64位和32位是CPU中处理的基本单位。它们不会影响数组元素的大小。

您的图像处理字节顺序,这是一个完全不同的概念。

如果您的整数值(十六进制)89AB需要两个字节,那么89或AB会进入第一个字节吗?

该答案取决于处理器。一些处理器将最高有效字节放在首位,以便89在内存中排在AB之前。

某些处理器将最低有效字节拳头放在内存中,以便AB排在89之前。

(某些处理器是可配置的,以便操作系统可以选择在启动时使用哪种顺序。)

  

图片为32位表示(32位OS)。因此,每个存储阵列都具有32位存储空间,因为每个十六进制数字都具有16位。我说的对吗?

否,几乎每个处理器都支持不同大小的整数。该图像可能反映了16位,32位,64位.....处理器。

  

就64位操作系统而言,我无法完全理解此代码的结果。难道每个操作系统中的每个内存插槽都有32位和64位吗?

不。所有(几乎所有?)现代处理器都在8位字节上运行。

示例代码的目的是在处理器上显示字节顺序。它与32位v.64位无关,除了编译器倾向于使用自然整数大小作为处理器。但这是编译器特定的东西,而不是处理器的东西。

你说你得到了

|39 |30 |00 |00

我猜您正在使用Intel或Intel兼容处理器。如果您在68000上运行它,将会得到

|00 |00 |30 |39