首先重新回忆一下计算机组成原理中的基本概念,数据在内存中的操作是使用补码进行加减操作。int类型占4个字节长度,即32位,char类型占1个字节长度,即8位。
char的范围是 -128~127,unsigned char的取值范围是0~256。原码、反码和补码的转换关系
回忆一下union的特点:所有成员的起始地址一致( union 型数据所占的空间等于其最大的成员所占的空间,对union 型的成员的存取都是相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始)
80X86一般意味着小端存储和32位操作系统
回忆下大端模式和小端模式
- 大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
- 小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
为什么么要有大小端模式?
(自己的理解:因为C语言中有多种数据类型,而同一种处理器位数固定,即处理器中的寄存器每次处理数据位数有限,如果要处理的数据位数大于寄存器的位数,则需要考虑先从低地址位处理还是先从高地址位处理,进而引出了大端小端存储模式)
例题:
1
2
3
4
5
6
7
8
9
10
11
|
union Test
{
char
a[
4
];
short
b;
};
Test test;
test.a[
0
]=
256
;
test.a[
1
]=
255
;
test.a[
2
]=
254
;
test.a[
3
]=
253
;
printf(
"%d\n"
,test.b);
|
val=-128+(256-128)%256=0 ====>a[0]:00000000
char a[1]=255;
val=-128+(255-128)%256=-1 ====>a[1]:11111111
10000001(-1源码)
11111110(-1反码)
11111111(-1补码)
80X86-->小端模式 数据低位--->内存低地址
test XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
低地址 a[0] 00000000
a[1] 11111111
a[2] ........
a[3] ........
====>short 11111111 00000000(补码)
10000000 11111111( 反码)
10000001 00000000(源码-256)
个人愚见 ,仅供参考,欢迎拍砖,共同学习。
部分内容引用自一下网页,如果侵权,联系删除。
http://blog.csdn.net/vevenlcf/article/details/46924267
http://c.biancheng.net/cpp/html/450.html
https://www.nowcoder.com/questionTerminal/c7298be0b2ce42698b80987631cf8fca