鱼C论坛

 找回密码
 立即注册
查看: 2737|回复: 13

一道简单的问题

[复制链接]
发表于 2014-7-2 22:19:33 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 风之残月 于 2014-11-10 10:20 编辑
#include<stdio.h>
main()
{
        char *p="jklmnopqrstuvwxy";
        int  *t=(int *)p;
        t=t+1;
        printf("%x\n",*(t+1));
}
结果为什么是75747372而不是          72737475
j是0x6a

最佳答案

查看完整内容

X86或者x86_64平台上几乎没有大端法机器。不管大小端法机器char的字节J肯定是最先打出来的然后接着是k。如果是int型(或者说数据类型超过一个字节)就不同了,看我2楼的帖子:http://bbs.fishc.com/thread-45454-1-1.html 你的例题: 以下是小端法输出结果:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-2 22:19:34 | 显示全部楼层
本帖最后由 oggplay 于 2014-7-5 21:25 编辑
luckin 发表于 2014-7-4 18:42
小端机,按整形读出来的值应该是   0x75747372
小端机,按整形读出来的值应该是   0x72737475

[b]X86或者x86_64平台上几乎没有大端法机器。不管大小端法机器char的字节J肯定是最先打出来的然后接着是k。如果是int型(或者说数据类型超过一个字节)就不同了,看我2楼的帖子:http://bbs.fishc.com/thread-45454-1-1.html[/b]

抓图1.png
你的例题:
 #include<stdio.h>

 int
 main()
    {
            char p[]="jklmnopqrstuvwxy";
            int i;
            int  *t=(int *)p;
            t+=2;
           
            for(i=0;i<sizeof(p)-1;i++)
                printf("%p:%.2x ",p+i,p[i]);
            printf("\n");
            
            printf("=======int是这么存储的:大端法数字高位在低字节,小端法高位在高字节=======\n");       
            printf("*t = %x\n",*t);
            
            printf("===============字符串类型:指针第一个是谁就是谁=========================\n");
            printf("p[]= ");
            for(i=0;i<4;i++)
                printf("%.2x ",p[i+8]);
            printf("\n");
            return 0;

}
以下是小端法输出结果:
抓图6.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-2 23:10:07 | 显示全部楼层
不懂  看样子应该是啥循环???  初学   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-3 01:54:28 | 显示全部楼层
为什么是75747372?我想问问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-3 01:55:07 | 显示全部楼层
问错了, 想问为什么是72737475

??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-3 07:37:45 | 显示全部楼层
补充一下 j是0x6a
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-3 09:22:36 | 显示全部楼层
本帖最后由 流行语 于 2014-7-3 09:35 编辑
#include<stdio.h>
main()
{
        char *p="jklmnopqrstuvwxy";
        int  *t=(int *)p;
                printf("p=%x\n",p);
                printf("t1=%x\n",t);
        t=t+1;
                printf("t2=%x\n",t);
                printf("t3=%x\n",t+1);
                printf("p8=%x\n",p+8);
                printf("p8=%s\n",p+8);
        printf("%x\n",*(t+1));
                printf("r=%d,s=%d,t=%d,u=%d\n",'r','s','t','u');
}
我用的是vc++6.0测试的,我的机器整形占用4个字节,字符占用1个字节。我测试结果输出是75747372。因为t+1最后指向的地址是从r地址开始,占有4个字符即“rstu”,而这4个字符的ascii码分别是114(0111 0010),115(0111 0011),116(0111 0100),117(0111 0101),在输出时输出4个字节的内容,可是我的机器中的字节排序是从右到左,即“utsr”,所以最后输出75747372(从低字节到高字节),如果你的机器输出顺序从左到右,则结果为72737475(从高字节到低字节)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-3 09:58:07 | 显示全部楼层
本帖最后由 戏++ 于 2014-7-4 22:21 编辑

小端,低地址对应整形的低位,高地址对应高位
大端,反之

内存中  72  73  74  75
   地址   低--------->高
小端机,按整形读出来的值应该是   0x75747372
大端机,按整形读出来的值应该是   0x72737475

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-3 12:13:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-3 23:37:01 | 显示全部楼层
你输出的是下一个地址的内容,
还有。。t=t+1为t跳过4个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-4 06:35:22 | 显示全部楼层
7楼正解:loveliness:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-4 15:05:29 | 显示全部楼层
很久也前在学校学习的C++, 现在不记得多少了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-7-4 18:42:36 | 显示全部楼层
戏++ 发表于 2014-7-3 09:58
小端,低地址对应整形的低位,高地址对应高位
大端,反之

小端机,按整形读出来的值应该是   0x75747372
小端机,按整形读出来的值应该是   0x72737475

两个都是小端?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-7-5 09:57:13 | 显示全部楼层
char *p=jklmnopqrstuvwxy;  内存中放的是jklmnopqrstuvwxy 对应的ascii
int  *t=(int *)p;  t也指向那块内存
t++; t越过jklm
printf("%x\n",*(t+1));  t在越过nopq
也就是读取的是
rstu 二进制就不写了啊
内存中存放是
r    s   t   u
其中 u 是最高位 r是最低位  我记得学汇编是甲鱼讲过 这内存的方法
所以以十六进制读取时先读高位也就是u的ascii 所以回事 75 74 73 72
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 14:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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