关于字节表示的问题
本帖最后由 jiuyuan 于 2019-8-9 22:06 编辑代码我重新贴在下面楼层了,好像是3楼。我不太会排版,(我不知道怎么把代码和文本放在一起,放一起总有一方会乱),大家将就看下。抱歉。
****************************************************************************************************************************************我发不了图片,就打出来书中的描述:
对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。在几乎所有的机器上,
多字节对象都被存储为连续的字节序列,对象的地址为所使用的字节中最小的地址。例如,假设一个类型为int的变量x的地址为0x100,也就是说地址表达式&x的值为0x100。
那么,(假设数据类型int为32位表示)x的4个字节将被存储在内存的0x100,0x101,0x102和0x103位置。
***************************************************************************************************************************************
我的处理器是i特尔的,按小端模式存储int类型变量。用的c编译器int是4字节的。
下面是上述程序的运行结果:
62fe44
62fe20
78
62fe21
56
62fe22
34
62fe23
12
两个问题:1&a的值按书上的说法,值是0x62fe44,然后a的其他部分应该被存储在0x62fe45,62fe46,62fe47位置啊.
2(去掉主函数的注释)如果再声明一个int变量b,程序结果如下,怎么指向内存字节的指针的值(指向变量a,b各个部分字节的指针)还重复了?
62fe3c
62fe38
62fe10 78
62fe1156
62fe1234
62fe1312
62fe1056
62fe1134
62fe1212
62fe1300
楼主,你贴出的代码中所有的[ i ] 都被当成是斜字体的页面格式描述符,从而被过滤掉了,最好把你的代码贴到代码块里,可以有效地避免出现这种情况。 #include <stdio.h>
typedef unsigned char * byte_pointer; // byte_pointer为指向无符号char的指针
void show_bytes(byte_pointer start,size_t len)
{
size_t i;
for(i=0;i<len;i++)
{
printf("%x \n",start+i);
printf("%.2x\n",start);
printf("\n");
}
printf("\n");
}
void show_int(int x)
{
show_bytes((byte_pointer) &x,sizeof(int)); //强制类型转换,&x指向无符号字节
}
int main()
{
int a=0x12345678;
// int b=0x00123456;
int *p=&a;
// int *q=&b;
printf("%x \n\n",p);
// printf("%x \n\n",q);
show_int(a);
// show_int(b);
return 0;
} 本帖最后由 jackz007 于 2019-8-9 23:40 编辑
1. 为了弄清楚问题,首先看看变量是如何传递的,在 main() 中,显示变量 a 的字节内容是通过 show_int(a) 语句实现的; 这是一个典型的传值调用方式,变量 a 的值是通过堆栈传入函数 show_int() 函数的,在这个函数内部,变量 a 事实上已经被另一个局部变量 x 取代,所以, show_bytes() 所显示的变量地址并不是变量 a 或 b 的实际地址,而是 show_int()函数中的局部变量 x 的地址。
2. 如果去掉注释,显示变量 b 的地址与 a 的完全相同,这个也很好理解,因为它们显示的都是 show_int() 函数中局部变量 x 的内存地址,二者相同也就没什么好值得奇怪的了。
#include <stdio.h>
void show_bytes(unsigned char * start , size_t len)
{
size_t i ;
for(i = 0 ; i < len ; i ++) printf("0x%08x : %02x\n" , start + i , start) ;
printf("\n") ;
}
void show_int(int x)
{
show_bytes((unsigned char *) & x , sizeof(int)) ; //强制类型转换,&x指向无符号字节
}
int main()
{
int a = 0x01234567 ;
int b = 0x89ABCDEF ;
int * p = & a ;
int * q = & b ;
printf("\n") ;
printf("0x%08x \n" , p) ;
printf("0x%08x \n" , q) ;
printf("\n") ;
show_int(a) ;
show_int(b) ;
} jackz007 发表于 2019-8-9 23:21
1. 为了弄清楚问题,首先看看变量是如何传递的,在 main() 中,显示变量 a 的字节内容是通过 show_ ...
感谢大佬,我懂了。
页:
[1]