在one of the answers上How 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
?
答案 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}}基础2
比10
略高一点。
答案 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_BIT
是char
中的位数(最有可能是8),sizeof(int)
是2或4,所以ENOUGH
是7或12,这就足够了用于保存int的空格,包括符号和NULL终止符。