【发布时间】:2012-07-27 09:38:23
【问题描述】:
fwrite 是可移植的吗?我并没有真正面临下面描述的问题,但我想了解 C 的基础知识。
免得假设我们有两台机器 A8(字节 = 8 位)和 B16(字节 = 16 位)。
下面的代码会在两台机器上产生相同的输出吗?
unsigned char[10] chars;
...
fwrite(chars,sizeof(unsigned char),10,mystream);
我猜 A8 将产生 80 位(10 个八位字节),而 B16 将产生 160 位(20 个八位字节)。 我错了吗?
如果仅使用 uintN_t 类型,则不会出现此问题,因为它们的位长度与字节大小无关。但也许 uint8_t 在 B16 上不存在。
这个问题的解决方案是什么?
我猜想构建一个 uint32_t 数组,将我的字节放入这个数组中(根据机器的架构使用智能移位和掩码)并编写这个数组将解决问题。但这并不令人满意。再次假设 uint32_t 存在于所有平台上。这个数组的填充将非常依赖于当前机器的架构。
感谢您的回复。
【问题讨论】:
-
"但 B16 上可能不存在 uint8_t。"不能,除了位域之外,没有任何东西可以小于
char。 -
sizeof(char)总是 1. -
"我猜 A8 会产生 80 个八位字节,B16 会产生 160 个八位字节。我错了吗?"是的,这将是80个。 160 bits 或 10 resp。 20 八位字节.
-
简答:代码可以移植,生成的数据不能移植。一台机器可以有任何字长、CHAR_BIT 或字节序。网络人员使用“八位字节”一词来确保他们假设 8 位字节。碰巧具有不同 CHAR_BIT 值的实现(对于 TCP/IP)应该表现“AS-IF”。
-
@mvera -
char没有字节序,它只有一个“端”。
标签: c