• 有关十六进制的一道题


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

    题目如下:

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

    #include<stdio.h>
    
    void main()
    {
        int x=0x100100;
        char *p=(char*)&x;
        *p='A';
        p=p+2;
        *p=50;
        printf("%x
    ",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
    ",*(p+2));
        printf("%s
    ",p+2);
        printf("%x
    ",*(x+2));
    }

    结果如下:

  • 相关阅读:
    SqlMembershipProvider的配置
    自定义HtppHandler和HttpModule
    [导入]Sql Server 2005 Express中配置用户
    [导入]Asp.net中使用客户端脚本的方法
    JumpServer 架构浅解
    你准备好开始DevOps了吗?
    为什么是戒了爱你
    今天考试了
    [心疼女友]
    这个世界看不清
  • 原文地址:https://www.cnblogs.com/yaoyueduzhen/p/4348469.html
Copyright © 2020-2023  润新知