鱼C论坛

 找回密码
 立即注册
查看: 1483|回复: 4

[已解决]关于字节表示的问题

[复制链接]
发表于 2019-8-9 21:20:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jiuyuan 于 2019-8-9 22:06 编辑

[i][i]代码我重新贴在下面楼层了,好像是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
62fe11  56
62fe12  34
62fe13  12

62fe10  56
62fe11  34
62fe12  12
62fe13  00


[/i][/i]
最佳答案
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[i]) ;
        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)             ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-9 21:59:42 | 显示全部楼层
      楼主,你贴出的代码中所有的[ i ] 都被当成是斜字体的页面格式描述符,从而被过滤掉了,最好把你的代码贴到代码块里,可以有效地避免出现这种情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[i]);
                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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i]) ;
        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)             ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢大佬,我懂了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 03:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表