我想确保自己的想法。
图片为32位表示(32位OS)。因此,每个存储阵列都具有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位。哪里错了?请纠正我的想法。...
答案 0 :(得分:-1)
广告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