luckin 发表于 2014-7-2 22:19:33

一道简单的问题

本帖最后由 风之残月 于 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

oggplay 发表于 2014-7-2 22:19:34

本帖最后由 oggplay 于 2014-7-5 21:25 编辑

luckin 发表于 2014-7-4 18:42
小端机,按整形读出来的值应该是   0x75747372
小端机,按整形读出来的值应该是   0x72737475


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


你的例题:
#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);
            printf("\n");
            
            printf("=======int是这么存储的:大端法数字高位在低字节,小端法高位在高字节=======\n");      
            printf("*t = %x\n",*t);
            
            printf("===============字符串类型:指针第一个是谁就是谁=========================\n");
            printf("p[]= ");
            for(i=0;i<4;i++)
                printf("%.2x ",p);
            printf("\n");
            return 0;

}

以下是小端法输出结果:

gentes 发表于 2014-7-2 23:10:07

不懂看样子应该是啥循环???初学   

喜欢散步 发表于 2014-7-3 01:54:28

为什么是75747372?我想问问

喜欢散步 发表于 2014-7-3 01:55:07

问错了, 想问为什么是72737475

??

luckin 发表于 2014-7-3 07:37:45

补充一下 j是0x6a

流行语 发表于 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(从高字节到低字节)。

戏++ 发表于 2014-7-3 09:58:07

本帖最后由 戏++ 于 2014-7-4 22:21 编辑

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

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

河蟹代码 发表于 2014-7-3 12:13:58

gentes 发表于 2014-7-2 23:10 static/image/common/back.gif
不懂看样子应该是啥循环???初学

根本没有循环。。。。

奥特曼先生 发表于 2014-7-3 23:37:01

你输出的是下一个地址的内容,
还有。。t=t+1为t跳过4个字节

Mikel 发表于 2014-7-4 06:35:22

7楼正解:loveliness:

彳山一几攵 发表于 2014-7-4 15:05:29

很久也前在学校学习的C++, 现在不记得多少了

luckin 发表于 2014-7-4 18:42:36

戏++ 发表于 2014-7-3 09:58
小端,低地址对应整形的低位,高地址对应高位
大端,反之



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

两个都是小端?

牡丹花下死做鬼 发表于 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
页: [1]
查看完整版本: 一道简单的问题