Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C标准库/函数,用于查找硬件的字节顺序_C - Fatal编程技术网

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是否有编译时替代方法?可能是宏。