码迷,mamicode.com
首页 > 其他好文 > 详细

有关十六进制的一道题

时间:2015-03-18 20:22:31      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

今天有一位同学问了我一道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));
}

结果如下:

技术分享

 

有关十六进制的一道题

标签:

原文地址:http://www.cnblogs.com/yaoyueduzhen/p/4348469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!