有关十六进制的一道题

今天有一位同学问了我一道c语言的题目,表示被虐了,问了通神才明白。。。。(通神就是牛!!!)

题目如下:

给出下面程序的运行结果:

#include<stdio.h>

void main()
{
    int x=0x100100;
    char *p=(char*)&x;
    *p='A';
    p=p+2;
    *p=50;
    printf("%x\n",x);
}

运行结果是    320141
这是为什么呢?

大家都知道,int 类型的变量在内存中占 4 个字节(一个字节有8位,所以 x 在内存中是以二进制存储的,即:0000 0000       0001 0000        0000 0001         0000 0000

而char 类型变量在内存中只占 1 个字节,所以第二条语句运行后,p 指向 x 的最后一个字节,即:0000 0000,然后将这个字节赋值为'A',即十进制中的 65 ('A'的ASCII码值为65),十六进制中的 0x41,此时 x 变为0x100141。

然后p指向 x 的第三个字节,即:0001 0000   ,将这个字节赋值为50,即十六进制中的 0x32,    x就变为0x320141。

这道题活用了十六进制的保存方式(其实只是我不会。。。),然后需要注意的是指针取字节的时候是从低位取起的,二进制下,右边为低位,左边为高位。

在这里添一道题,同样求运行结果,大家看看有没有懂了:

 

#include<stdio.h>

void main()
{
    char*p="abcefghijklmnopqrstuvwxyz";
    int *x=(int *)p;
    x++;
    printf("%c\n",*(p+2));
    printf("%s\n",p+2);
    printf("%x\n",*(x+2));
}

结果如下:

 

posted @ 2015-03-18 19:36  邀月独斟  阅读(533)  评论(0编辑  收藏  举报