关于c语言语法--数据在内存的存放

  本文章谈论一些比较有趣的事情...

    先来看个代码

 1 #include <stdio.h>
 2 
 3 int main()
 4 
 5 {
 6   short x = 0x1122;
 7 
 8   char x1, x2;
 9 
10   x1 = ((char *)&x)[0];
11 
12   x2 = ((char *)&x)[1];
13 
14   
15 
16   printf("x1: %d  x2: %d", x1,x2);
17 
18   return 0
19 
20 }

 

 

假如寻址方式从低字节开始

    如果x1 打印22那么编译器(或运行的环境)小端模式  x2打印11

    如果x1打印11那么编译器(或运行的环境)大端模式   x2打印22

  大小端模式是以字节存储顺序的不同而区分.

 

=======================程序解析=================================

  1.short在32位操作系统是占用两个字节的

  2.第十行,((char *)&x)[0]   以x 首地址为起始,取x 的首地址,然后将这个地址强制转换为指向 char 类型的指针 

          也就是说,((char *)&x) 这个地址是一个指针! 它将指向char 这种类型,作用目标是一个字节.

          那它到底指向那里呢?  这就需要看它存放了那个地址了, p[0] <===> 等效于 *(p+0);

          向后偏移零个目标.....取第一个元素地址,也就是指向第一个元素啦~~~

  

   3.第十一行,((char *)&x)[1]  以x 首地址为起始,取x  的首地址,然后将这个地址强制转换为指向 char 类型的指针

          也就是说,((char *)&x) 这个地址是一个指针! 它将指向char 这种类型,作用目标是一个字节,

          那它到底指向那里呢?  这就需要看它存放了那个地址了,p[1] <===> 等效于 *(p+1);

          向后偏移一个目标(偏移一个字节).....取第二个元素地址,也就是指向第二个元素啦~~~

=====================================================================================

  如果小端模式:存放是 22          11  (地址增长方向和值增长方向一致)

          低地址---------->高地址   

  如果大端模式:存放是 11          22  (地址增长方向和值增长方向不一致)

          低地址---------->高地址         

 

 

 

 

#include <stdio.h>
int main(int argc, char const *argv[])
{
    float a = 1.0;
    int *p = (int *)&a;
    printf("%X\n",  *p );
    return 0;
}

输出结果是 3f80000  (16进制)

===========================================

  整型数据在内存的存储方式和整数不同

  

posted @ 2017-03-07 10:08  得了白学症  阅读(300)  评论(2编辑  收藏  举报