是否有一种编程方式来检测您是否在大端或小端架构上?我需要能够编写将在Intel或PPC系统上执行的代码并使用完全相同的代码(即没有条件编译).
是否值得使用C的位域实现?如果是的话,什么时候使用?
我正在查看一些仿真器代码,看起来芯片的寄存器没有使用位字段实现.
这是出于性能原因(或其他原因)而避免的吗?
是否仍然使用位字段?(即固件放在实际芯片上等)
我已经看到了关于结构的字节序的一些问题和答案,但它们是关于检测系统的字节序,或者在两个不同的字节序之间转换数据.
但是,如果有一种方法可以强制执行给定结构的特定字节顺序,那么我现在想要的是什么.是否有一些好的编译器指令或其他简单的解决方案,除了重写操作在位域上的很多宏的整个事情?
一般的解决方案会很好,但我也会对特定的gcc解决方案感到满意.
编辑:
感谢所有评论指出为什么强制执行endianness不是一个好主意,但在我的情况下,这正是我需要的.
特定处理器生成大量数据(永远不会改变,它是带有自定义硬件的嵌入式系统),并且必须由在未知处理器上运行的程序(我正在处理)读取.对数据进行字节评估会非常麻烦,因为它包含数百种不同类型的结构,这些结构非常庞大且深入:它们中的大多数都有许多其他巨大的结构层.
改变嵌入式处理器的软件是不可能的.源是可用的,这就是为什么我打算使用该系统的结构而不是从头开始并按字节方式评估所有数据.
这就是为什么我需要告诉编译器它应该使用哪个字节序,无论效率与否都无关紧要.
它不一定是字节序的真正变化.即使它只是一个接口,物理上所有东西都是在处理器自己的字节序中处理的,但我完全可以接受.
在一个补充平台上,下面的代码会打印什么?
#include <iostream>
int main() {
int i = 1, j = -1;
std::cout << i+j << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我怀疑它会打印"0"而不是"-0",但我似乎找不到任何权威的东西.
编辑:为了澄清,我对如何打印-0感兴趣,有几个人建议在实践中,使用上述代码实现one-compliment可能不会产生负零.
在这些情况下,建议以下实际生成-0:
#include <iostream>
int main() {
std::cout << ~0 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题仍然存在:这将打印什么?