在 c 中找到一个 int 的位宽;最佳跨平台方法

Posted

技术标签:

【中文标题】在 c 中找到一个 int 的位宽;最佳跨平台方法【英文标题】:finding the bit-width of an int in c; best-cross platform method 【发布时间】:2014-01-11 22:46:00 【问题描述】:

我需要知道我的代码正在运行的系统中本机 int 的宽度(大小),以位为单位。

我可以使用“sizeof”来获取字符的宽度,但是,我的理解是,在 C 规范中,char 没有分配特定数量的位。

那么找到 int 位宽的最佳跨平台方法是什么?

【问题讨论】:

"... 需要知道 ... 的宽度(大小),以位为单位。" 那么标题最好是:“finding the bit-宽度 ..."? 是的,我很抱歉 - 已编辑 【参考方案1】:

打开limits.h,您应该会看到有关特定平台整数限制大小的所有信息。

这是您确定int 中有多少位的方法:

#include <limits.h>
printf("Number of bits in an int: %zu\n", sizeof(int) * CHAR_BIT);

如果您对特定平台的floatdouble 限制感兴趣,请打开float.h

【讨论】:

【参考方案2】:

CHAR_BIT(来自&lt;limits.h&gt;)是char中的位数,所以

sizeof(int) * CHAR_BIT

就是你要找的。​​p>

CHAR_BIT 在“5.2.4.2.1 整数类型的大小”中指定 符合 C99 标准。

添加: Open Group 规范可能会很有趣

http://pubs.opengroup.org/onlinepubs/7999959899/basedefs/limits.h.html

状态:

限制 CHAR_BIT、SCHAR_MAX 和 UCHAR_MAX 的值是 现在需要分别为 8、+127 和 255。

【讨论】:

如果它是一个符合 Posix 的系统,你可以使用WORD_BIT,fwiw。否则,不能保证int 中没有填充位。【参考方案3】:

如果每个字符不使用 8 位,我会感到非常惊讶。你可以用更多的字符填充一个字符,然后它应该像 0xFFFF 一样,看看它的值是什么。

【讨论】:

不要太惊讶!大于 8 位的字符实际上很常见。

以上是关于在 c 中找到一个 int 的位宽;最佳跨平台方法的主要内容,如果未能解决你的问题,请参考以下文章

verilog里的位宽是啥概念?

内存寻址能力与CPU的位宽有关系吗?

数电:原码反码补码以及运算中的位宽问题

verilog中有谁用过用parameter定义的常数做赋值语句的位宽限制

非对齐访问和Alignment Fault

Verilog定义计算位宽的函数clogb2