查看CPU的大小端模式
2012-05-17 20:12
225 查看
大小端:CPU对内存单元数据的排列顺序的方式.
采用小端(Little-endian)模式的CPU对操作数的存放方式是从低字节到高字节(从右到左即从低到高);这是X86平台采用的模式;
采用大端(Big-endian)模式对操作数的存放方式是从高字节到低字节;在网络上传送的数据采用的方式;
例如:
16bits宽的数:0x1234在Little-endian模式的CPU中内存的存放方式为:
0x4000 0x34
0x4001 0x12
而在Big-endian中则为:
0x4000 0x12
0x4000 0x34
测试你当前环境的CPU的工作方式(即查看大小端)
#include <stdio.h>
#include <stdlib.h>
union word
{
int a;
char b;
}c;
int checkCPU(void)
{
c.a = 1;
return (c.b == 1);
}
int main(void)
{
int i = checkCPU();
if ( i==0 )
{
fprintf(stdout, "this is Big_endian\n");
}
else if ( i==1 )
{
fprintf(stdout, "this is Little_endian\n");
}
return 0;
}
为什么可以这样子检测出来呢?这是利用C语言的共同体的特性:所有成员都是从低地址开始存放的。
让我们来分析以上的代码:(假设是在X86,并假设是在低端模式的,然后证明它,即数学上的反证法啦。呵呵)平台下32bits下存放的:
a, b在内存中的排列:
地址 数据(a) 数据(b)
000000001 0x01 0x??
000000002 0x00
000000003 0x00
000000004 0x00
我们在checkCPU中将int a赋值为1.为什么可根据return (c.b == 1)的判定结果来判断大小端呢?注意到,我们没有为c.b赋值,所以它的值会是之前(即a)的数据存放的值。注意到,共同体的特性是:所有成员都是从低地址开始存放的。所以如果是在低端模式下:c.b的值应该是0x01。在高端模式下,c.b的值应该是0x00。所以就可以判断该当前环境的工作的大小端模式了。呵呵。
采用小端(Little-endian)模式的CPU对操作数的存放方式是从低字节到高字节(从右到左即从低到高);这是X86平台采用的模式;
采用大端(Big-endian)模式对操作数的存放方式是从高字节到低字节;在网络上传送的数据采用的方式;
例如:
16bits宽的数:0x1234在Little-endian模式的CPU中内存的存放方式为:
0x4000 0x34
0x4001 0x12
而在Big-endian中则为:
0x4000 0x12
0x4000 0x34
测试你当前环境的CPU的工作方式(即查看大小端)
#include <stdio.h>
#include <stdlib.h>
union word
{
int a;
char b;
}c;
int checkCPU(void)
{
c.a = 1;
return (c.b == 1);
}
int main(void)
{
int i = checkCPU();
if ( i==0 )
{
fprintf(stdout, "this is Big_endian\n");
}
else if ( i==1 )
{
fprintf(stdout, "this is Little_endian\n");
}
return 0;
}
为什么可以这样子检测出来呢?这是利用C语言的共同体的特性:所有成员都是从低地址开始存放的。
让我们来分析以上的代码:(假设是在X86,并假设是在低端模式的,然后证明它,即数学上的反证法啦。呵呵)平台下32bits下存放的:
a, b在内存中的排列:
地址 数据(a) 数据(b)
000000001 0x01 0x??
000000002 0x00
000000003 0x00
000000004 0x00
我们在checkCPU中将int a赋值为1.为什么可根据return (c.b == 1)的判定结果来判断大小端呢?注意到,我们没有为c.b赋值,所以它的值会是之前(即a)的数据存放的值。注意到,共同体的特性是:所有成员都是从低地址开始存放的。所以如果是在低端模式下:c.b的值应该是0x01。在高端模式下,c.b的值应该是0x00。所以就可以判断该当前环境的工作的大小端模式了。呵呵。
相关文章推荐
- 怎么用软件代码判断CPU是大端模式还是小端模式
- CPU的大端模式(big endian)和小端(little endian)模式
- 数值存储(一)-CPU大端和小端模式详解
- CPU的大端模式(big endian)和小端(little endian)模式——Union的妙用
- 利用union判断CPU是大端模式还是小端模式
- 如何判断CPU是大端模式还是小端模式
- 用C语言代码判别CPU的大小端模式
- cpu 大小端模式
- 如何判断CPU是大端还是小端模式
- 如何判断CPU是大端还是小端模式
- 判断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式
- linux下查看CPU个数、核数、运行模式以及是否支持超线程技术
- 如何判断CPU是大端还是小端模式
- CPU的大端模式和小端模式
- CPU的大端模式(big endian)和小端(little endian)模式
- CPU的大小端模式
- 如何判断CPU是大端还是小端模式
- 查看linux系统版本、内核、cpu、cpu运行模式
- 【转】如何判断CPU是大端还是小端模式
- 如何判断CPU是大端还是小端模式