• C指针类型转换问题


    先看下面的代码:

    #include<stdio.h>
    
    int main ()
    {
    int a;
    char *x;
    x = (char *) &a;
    a = 512;
    x[0] = 1;
    x[1] = 2;
    printf("%d
    ",a);
    
    return 0;
    } // 针对x86的处理器来说,其结果为513
    

      


    原因

    程序首先声明了一个int变量,在我的电脑中,此int占用4字节。然后声明了一个x指针,同样,在我的电脑中它占用8字节。然后将a的内存地址赋值给x指针,注意这里用到了类型转换:x=(char *) &a。如果不使用类型转换,x指向的int型的内存单元大小为4字节,如果使用了类型转换,x指向的char型的内存单元大小为1字节。

    变量a的值为512,用4个字节的普通二进制表示就是:

        00000000 00000000 00000010 00000000

    由于x86 CPU的字节序为小端序(最低有效位在最高有效位的前面),所以前面的二进制以小端序的表示方式为:

        00000000 00000010 00000000 00000000

    操作方式是:先获取最右边的8位数字,然后放到新行的左边;然后获取下一个8位数字,再放到新行的左边,它紧挨着上一个8位数字。以此循环操作,直到数据读取完毕。注意的是一个字节(8位)里的数字顺序是不变的。

    x[0]表示指向a内存区域的第一个字节,并设置为1,此时的a内存表示为:

        00000001 00000010 00000000 00000000

    然后是x[1]设置为2,则a内存表示为:

        00000001 00000010 00000000 00000000

    然后将a内存转为普通二进制表示方式(方式为从右到左读取):

        00000000 00000000 00000010 00000001

    最后的结果为:

        513

    最后修改时间:2018-01-26 19:55

  • 相关阅读:
    grapesjs 强大的web builder 框架
    浏览器指纹信息获取js 包的使用
    让自己的npm包支持npm WARN deprecated
    actionherojs 中间件参考流程
    dremio 集成lakefs
    dremio 20.1 官方release note 提供了
    edgedb 1.0 发布了
    posthog 开源产品分析工具
    lakefs 源码构建
    grouparoo 源码项目结构
  • 原文地址:https://www.cnblogs.com/ranwuer/p/8361351.html
Copyright © 2020-2023  润新知