【发布时间】:2018-10-12 02:09:31
【问题描述】:
我听说int 等数据类型的大小可能因平台而异。
我的第一个问题是:有人可以举一些例子吗,出了什么问题,当程序
假设 int 是 4 个字节,但在不同的平台上是 2 个字节?
我的另一个问题是相关的。我知道人们用一些typedefs 来解决这个问题,
就像你有像u8,u16,u32 这样的变量 - 无论平台如何,它们都保证是 8 位、16 位、32 位 - 我的问题是,这通常是如何实现的? (我不是指来自stdint 库的类型 - 我很好奇手动,如何强制某些类型总是说 32 位,而不管平台如何?)
【问题讨论】:
-
覆盖内存存在潜在问题。如果您假设一个整数在另一个平台上是 2 个字节时是 4 个字节,这取决于内存的布局方式,您可以覆盖整数之后的接下来的 2 个字节。
-
现在是阅读 Usenet 时代的(旧的,但信息量很大的)C 常见问题解答的好时机:faqs.org/faqs/C-faq/abridged 然后faqs.org/faqs/C-faq/faq(未删节,所以如果你可以阅读那个代替!更多信息)。它讨论了其中的许多,以及许多其他经常错误的假设(NULL 的内部表示等)。 (必读的是关于 null 和指针/数组的章节。其余的也很好,对许多主题大开眼界)
-
请注意字节顺序也可能因平台而异。 (+1 提问 - 最好先提问,然后假设“
sizeof(void *)肯定永远是4)。 -
@MaciejPiechotka:同意。发布这些内容很好,因为许多读者可能会意识到潜在的陷阱及其解决方案!没有不好的问题[好吧,如果他们提供足够的上下文],只有不好的答案^^