编写C程序,以判断处理器的端(endianness)模式。如果处理器是大端模式,在控制台输出:处理器采用大端模式;否则,输出,处理器采用小端模式。
什么是大端/小端模式
大端模式
所谓的大端模式,是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前16位应该这样读: e6 84 6c 4e ( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相反.
小端模式
所谓的小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前16位应该这样读: 4e 6c 84 e6( 假设int占4个字节)
记忆方法: 地址的增长顺序与值的增长顺序相同.
方法一:使用C语言强制类型转换
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <stdio.h> int main() { int a=0x1234; char b=*(char*)&a; if(b==0x12) printf("处理器采用大端模式\n"); else printf("处理器采用小端模式\n"); return 0; } |
方法二:使用Union
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <stdio.h> union U{ int a; char c; }u; int main() { u.a=0x1234; if(0x34 == u.c) { printf("处理器采用小端模式\n"); } else if(0x12 == u.c) { printf("处理器采用大端模式\n"); } return 0; } |
结果:
Windows
Linux