C程序检查little和big endian
可能重复:C程序检查little和big endian,c,byte,endianness,C,Byte,Endianness,可能重复: 如果是little endian,它将打印1。如果是big-endian,它将打印0。对吗?或者,将char*设置为int x是否总是指向最低有效位,而不管是否为endianness?我想我知道我在标准中读到过这一点;但是找不到它。一直在找。古老的回答标题;不是Q-tex;P: 以下程序将确定: #include <stdio.h> #include <stdint.h> int is_big_endian(void) { union {
如果是little endian,它将打印1。如果是big-endian,它将打印0。对吗?或者,将char*设置为int x是否总是指向最低有效位,而不管是否为endianness?我想我知道我在标准中读到过这一点;但是找不到它。一直在找。古老的回答标题;不是Q-tex;P:
以下程序将确定:
#include <stdio.h>
#include <stdint.h>
int is_big_endian(void)
{
union {
uint32_t i;
char c[4];
} e = { 0x01000000 };
return e.c[0];
}
int main(void)
{
printf("System is %s-endian.\n",
is_big_endian() ? "big" : "little");
return 0;
}
和!is_big_endian()
不是100%的小,因为它可以混合/中间
相信可以使用相同的方法检查,仅将值从0x01000000
更改为,即0x01020304
给出:
switch(e.c[0]) {
case 0x01: BIG
case 0x02: MIX
default: LITTLE
但不完全确定这一点…这是一个脚本的大端测试:
#包括
int main(int argc,字符**argv){
易失性uint32_t i=0x01234567;
//返回0表示大端,返回1表示小端。
返回(*(uint8_t*)(&i))==0x67;
}
简言之,是的
假设我们在一台32位机器上
如果是little endian,内存中的x
将类似于:
higher memory
----->
+----+----+----+----+
|0x01|0x00|0x00|0x00|
+----+----+----+----+
A
|
&x
所以(char*)(&x)==1
,和*y+48==1'
如果它是big endian,它将是:
+----+----+----+----+
|0x00|0x00|0x00|0x01|
+----+----+----+----+
A
|
&x
因此,这个将是'0'
下面的操作就可以了
unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));
将
&x
设置为char*
将允许您访问整数的各个字节,并且字节的顺序将取决于系统的尾数。请参阅,这可能是相关的。@common-请注意,大尾数和小尾数不是唯一的选项,并非所有数据类型都需要相同,一些硬件可以在运行时配置。如果你真的需要检查这个,你可能需要检查更多的东西。如果你有选择的话,考虑在固定宽度数据类型上的按位操作来提取/设置比特。它们是用于userland甚至是内核模块的可移植的Great endianness演示代码:为什么要使用ASCII。使用'0'
。为什么要打印为字符而不是整数。为什么要以整数开始。你没有忘记在e.c[0]@Nate:1==1,1!=0, !!1或1是相同的。还是我在这里遗漏了什么?嗯不确定。。。这不是我的专长。我看到了一个类似的操作,但它的结尾是==1。所以我不确定。@Nate:是的。可能使用类似于e={0x01020304}的东西
然后需要a.c[0]==1
,因为a.c[0]
将是1
或4
在大与小的对比中。啊,就是这样。y上增加的值48有什么意义?@AbinMathewAbraham 48是“0”的ascii码:)我正在使用带有英特尔处理器的MAC OS。应该是小恩迪安。然而,1
似乎是一个特例,因为当1
存储在内存中时,它是用大端的。你能告诉我为什么不能只使用(char)x==1
?为什么我们必须获取地址,将其转换为char
指针,然后取消引用?如果使用(char)x
,这不是隐式完成的吗?@J…S我相信(char)x
无论是否使用endianness都可以工作。通过“work”,我的意思是它会将值1
分配给x
,因此无法通过这种方式检测端点。不需要声明为unsigned int。signed int也可以,因为1是正的,即使为sign保留了一位,对于正数,它将是0。为什么是volatile而不是const?我认为这是一种避免任何不希望的编译器优化的简单方法,并且实际查看ram单元中的数据来确定答案。thx,这里必须抑制优化。
higher memory
----->
+----+----+----+----+
|0x01|0x00|0x00|0x00|
+----+----+----+----+
A
|
&x
+----+----+----+----+
|0x00|0x00|0x00|0x01|
+----+----+----+----+
A
|
&x
unsigned int x = 1;
printf ("%d", (int) (((char *)&x)[0]));