关于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进制)
===========================================
整型数据在内存的存储方式和整数不同