zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    esp32(M5STACK)在线体验(Ubuntu)
    esp32(M5STACK)程序烧写(Ubuntu)
    在Ubuntu环境下搭建esp32开发环境
    markdown让文字居中和带颜色
    Doxyfile中插入图片
    System.load 与 System.loadLibrary 的使用
    常见mysql的数据迁移
    mysql中有关树的函数
    spring整合quartz实现动态定时器
    javaweb项目中发布webservices服务
  • 原文地址:https://www.cnblogs.com/ranwuer/p/8361351.html
Copyright © 2011-2022 走看看