为什么ENOUGH就足够了? (将int存储在char数组中)

时间:2014-09-15 13:05:49

标签: c char int stringification

one of the answersHow to convert an int to string in C(及其评论)中给出了以下解决方案

char str[ENOUGH];
sprintf(str, "%d", 42);
评论caf中的

提到ENOUGH可以在编译时确定:

#define ENOUGH ((CHAR_BIT * sizeof(int) - 1) / 3 + 2)

我得到了+ 2,因为你需要能够显示减号和空终止符,但是其他部分背后的逻辑是什么?具体来说是CHAR_BIT

3 个答案:

答案 0 :(得分:5)

如果int类型是32位,那么您需要多少字节来表示任何数字(没有符号和空终止符)?

如果int类型为32位,则最大int值为2147483648(假设为2的补码),即10个数字,因此需要10个字节用于存储。

要知道特定平台int中的位数(例如,我们示例中为32),我们可以使用CHAR_BIT * sizeof (int) == 32。记住CHAR_BIT是C字节中的位数,sizeof产生一个字节大小。

然后(32 - 1) / 3 == 10需要10个字节。您可能也想知道作者如何找到值3?那么log的{​​{1}}基础210略高一点。

答案 1 :(得分:1)

我假设ENOUGH以保守的方式计算,因为最终的+2考虑了\ 0 null终止符(总是存在,没关系)和“ - ”减号(有时存在)。对于正值(和零),最终会得到一个未使用的额外字节。

因此,如果不计算ENOUGH作为存储值所需的严格最小字节数,为什么不使用固定值12? (数字为10个字节,\ 0和符号为2个字节)

然而:

CHAR_BIT * sizeof(int)是在机器中存储int的确切位数。

-1是因为1位用于符号(你“消耗”1位信息来存储符号,不管涉及的技术是什么,让它成为二进制补码,一个补码或天真符号存储)

/ 3是因为每1个十进制数字至少需要3位信息

答案 2 :(得分:0)

CHAR_BITchar中的位数(最有可能是8),sizeof(int)是2或4,所以ENOUGH是7或12,这就足够了用于保存int的空格,包括符号和NULL终止符。