jiuyuan 发表于 2019-8-9 21:20:24

关于字节表示的问题

本帖最后由 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


jackz007 发表于 2019-8-9 21:59:42

      楼主,你贴出的代码中所有的[ i ] 都被当成是斜字体的页面格式描述符,从而被过滤掉了,最好把你的代码贴到代码块里,可以有效地避免出现这种情况。

jiuyuan 发表于 2019-8-9 22:01:59

#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:21:34

本帖最后由 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)             ;
}

jiuyuan 发表于 2019-8-10 07:55:37

jackz007 发表于 2019-8-9 23:21
1. 为了弄清楚问题,首先看看变量是如何传递的,在 main() 中,显示变量 a 的字节内容是通过 show_ ...

感谢大佬,我懂了。
页: [1]
查看完整版本: 关于字节表示的问题