C标准库/函数,用于查找硬件的字节顺序
我知道有很多不同的非标准方法来查找(和转换)硬件的端性。例如,是一个 我们有标准函数,如C标准库/函数,用于查找硬件的字节顺序,c,C,我知道有很多不同的非标准方法来查找(和转换)硬件的端性。例如,是一个 我们有标准函数,如htonl(),htons(),ntohl()和ntohs(),用于在主机和网络字节顺序之间转换值 现在我的问题是,与上面提到的标准宏类似,是否有任何标准C宏/函数可用于查找硬件的字节顺序 那么htonl(100)=100呢?端点性是平台的一个特性,通常在编译时就知道了htonl()、htons()、ntohl()和ntohs()并不总是函数:它们可能是使用条件编译来执行“魔术”的宏。为了让它们工作,有时BI
htonl()
,htons()
,ntohl()
和ntohs()
,用于在主机和网络字节顺序之间转换值
现在我的问题是,与上面提到的标准宏类似,是否有任何标准C宏/函数可用于查找硬件的字节顺序 那么
htonl(100)=100
呢?端点性是平台的一个特性,通常在编译时就知道了htonl()
、htons()
、ntohl()
和ntohs()
并不总是函数:它们可能是使用条件编译来执行“魔术”的宏。为了让它们工作,有时BIG_-ENDIAN
或LITTLE_-ENDIAN
是\define
d(但不是两者),(edit2)或在其他实现中,BIG_-ENDIAN和LITTLE_-ENDIAN都被设置为不同的值,字节顺序也被定义为一个或另一个。您可以检查这些定义的值,以在编译时找出平台的endian属性;但是,您这样做的方式将取决于您的实现
Edit1如果您的平台将endianness函数作为函数而不是宏来实现,您可以使用这些函数中的任何一个来查看它是否将1
转换为自身。如果是这样,那么你的硬件就是big-endian
特别感谢CharlesBailey对我答案初始编辑的观察。#include
#include <stdio.h>
int little_endian(){
int x = 1;
return *(char*)&x;
}
int big_endian(){
return !little_endian();
}
int main(){
if(big_endian())
printf("big_endian\n");
if(little_endian())
printf("little_endian\n");
return 0;
}
int little_endian(){
int x=1;
返回*(字符*)&x;
}
int big_endian(){
回来!小丁安();
}
int main(){
if(big_endian())
printf(“big_endian”);
if(little_endian())
printf(“little_endian”);
返回0;
}
也许:
#include <endian.h>
#if __BYTE_ORDER == __LITTLE_ENDIAN
#elif __BYTE_ORDER == __BIG_ENDIAN
#elif __BYTE_ORDER == __PDP_ENDIAN
#else
#error "no byte order"
#endif
#包括
#如果字节顺序=小字节
#elif uuu BYTE_ORDER==uuu BIG_ENDIAN
#elif字节顺序==\uu PDP\u ENDIAN
#否则
#错误“无字节顺序”
#恩迪夫
您可以存储一个已知值,然后检查生成的字节以了解表示形式,并保持在标准C的范围内
只有当您假设little-endian和big-endian是唯一的选择时,诸如htonl(n)==n之类的测试才能起作用-有关反例,请参见:
据我所知,endian.h还没有被写入任何标准(这是一个遗憾)。它甚至不存在于所有Unix平台上。取决于您对“标准C库”的定义:if(hton(i)==i).
htonl
不是C标准函数。请指定您感兴趣的标准。不,htonl
、htons
、ntohl
和ntohs
是POSIX.1-2001中规定的功能。如果您的实现为这些提供了屏蔽宏,那么这是一个可选的优化。@CharlesBailey感谢您的澄清!我的印象是htonl
等都是宏,但我发现我错了。我澄清了我的答案。谢谢在什么意义上这是一个答案?C标准没有这些endian宏。它们来自哪里?那么这是如何回答这个问题的,据我所知,它只与C有关。你的链接指的是htonl
等,BIG\u ENDIAN
和LITTLE\u ENDIAN
来自哪里?你仍然没有回答我的问题。大恩典和小恩典来自哪里?我没有看到POSIX中提到它们。OP满意只意味着巧合的是,他使用的系统与你的系统相似。哈!我的64号准将是小恩迪安这是8位机器,需要其他方式。@BLUEPIXY是否有编译时替代方法?可能是宏。