【问题标题】:Standard byte sizes for variables in C?C中变量的标准字节大小?
【发布时间】:2015-12-17 02:48:54
【问题描述】:

所以,我正在用 C 语言编写一个 ye olde SHA1 算法的实现(我知道它不安全,它是针对 Matasano 问题的),并且对于某些变量来说,它们的长度正好是 32 位非常重要。读到 unsigned long int 按标准是 32 位后,我就使用了它,然后花了 4 个小时试图找出为什么我的哈希值都错了,直到我想看看 sizeof(unsigned long int) 是什么结果。剧透,它是 64。

现在我当然在使用uint32_t,并且将来会一直使用,但是有人(最好是比我更谨慎、更容易轻信的人)请指出实际 为现代 C 编写了可变大小的标准?或者告诉我为什么这个问题被误导了,如果是的话?

【问题讨论】:

  • 实际 位置将成为标准,它和所有受人尊敬的教程和参考资料都说尺寸取决于平台。这就是添加 [u]intxx_t 类型的原因。
  • 标准规定 long int 将与 int 一样大或更大,并且非常努力避免过于具体。标准是寻找您寻求的答案的错误位置。
  • 在我在这里找到的标准的第 27 页上:open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf,它说:unsigned long int 类型的对象的最大值:2**32 - 1。这对我来说似乎很具体,所以我仍然不确定该相信什么......
  • 好的,在上面的一页上,它说“它们的实现定义的值的幅度(绝对值)应等于或大于所示的值”,因此解释了这一点。感谢大家的帮助。

标签: c variables memory stdint


【解决方案1】:

最小尺寸为:

  • char - 8 位
  • short - 16 位
  • int - 16 位
  • long - 32 位
  • long long - 64 位

没有最大大小,编译器编写者选择他们认为最适合目标平台的任何内容。相应的无符号类型具有相同的最小大小。

【讨论】:

  • 好吧,我应该说,我相信你,尽管据我所知,标准声明 unsigned long int 的 maximum 值为 2^32 - 1. 但我可能是看错了页面什么的……
  • @gmoss 标准没有这么说
  • 好的,我找到了“它们的实现定义的值在幅度(绝对值)上应等于或大于所示值”的短语。第 5.2.4.2.1 节,编号为 open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf 的第 26-27 页(pdf 第 45-46 页)。感谢您的快速帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多