gpt4 book ai didi

c - 基于位数的 int 中的最大位数

转载 作者:行者123 更新时间:2023-11-30 19:56:01 26 4
gpt4 key购买 nike

因此,我需要一个常量值来表示 int 中的最大位数,并且需要在编译时计算它以传递给 char 数组的大小。

添加更多细节:我正在使用的编译器/机器具有非常有限的 C 语言子集,因此所有 std 库都无法工作,因为它们具有不受支持的功能。因此,我不能使用 INT_MIN/MAX,因为我既不能包含它们,也不能定义它们。

我需要一个计算大小的编译时表达式。我想出的公式是:

((sizeof(int) / 2) * 3 + sizeof(int)) + 2

根据手工计算,对于 n 字节整数来说,它是勉强成功的。

sizeof(int)  INT_MAX               characters    formula
2 32767 5 7
4 2147483647 10 12
8 9223372036854775807 19 22

最佳答案

您正在寻找与相关整数类型最大值的对数相关的结果(该对数取决于您要计算其数字的表示形式的基数)。您无法在编译时计算精确的对数,但您可以编写宏来根据您的目的足够接近地估计它们,或者根据您的目的计算足够接近的上限。例如,参见How to compute log with the preprocessor .

了解可以通过乘以适当的常数来在不同底数的对数之间进行转换也很有用。特别是,如果您知道数字的底对数a并且想要底b对数,则可以将其计算为

logb(x) = loga(x)/loga (b)

不过,你的情况比一般情况要容易一些。对于非变长数组的数组维度,需要一个“整数常量表达式”。此外,对于您在 C 实现中找到的任何内置整数类型,您的结果不需要超过两位精度(如果您想要二进制位数,则为三位),并且看起来就像你只需要一个足够接近的上限。

此外,您可以从 sizeof 获得领先优势。运算符,它可以出现在整数常量表达式中,当应用于整数类型时,它会给出该类型值以 256 为底的对数的上限(假设 CHAR_BIT 为 8)。如果每个位都是值位,那么这个估计就非常严格,但是有符号整数有一个符号位,并且它们也可能有填充位,所以这个界限对它们来说有点宽松。

如果您想要对 2 的幂基数中的位数进行限制,则可以使用 sizeof相当直接。不过,假设您正在查找小数位数。从数学上讲,int 的十进制表示中的最大位数是

N = ceil(log10( MAX_INT ))

N = 下限(log10( MAX_INT )) + 1

前提是MAX_INT不是 10 的幂。让我们用以 256 为底的对数来表达它:

N = 下限( log256( MAX_INT )/log256(10) ) + 1

现在,log256(10) 不能成为整数常量表达式的一部分,但它或其倒数可以预先计算:1/log 256(10) = 2.40824(一个相当好的近似值;实际值略小)。现在,让我们用它来重写我们的表达式:

N <= 地板( sizeof(int) * 2.40824 ) + 1

这还不是一个整数常量表达式,但已经很接近了。这个表达式一个整数常量表达式,并且是一个足够好的近似值来满足您的目的:

N = 241 * sizeof(int)/100 + 1

以下是各种整数大小的结果:

sizeof(int)          INT_MAX   True N  Computed N    1                    127      3        3    2                  32767      5        5    4             2147483648     10       10    8       ~9.223372037e+18     19       20

(The values in the INT_MAX and True N columns suppose one of the allowed forms of signed representation, and no padding bits; the former and maybe both will be smaller if the representation contains padding bits.)

I presume that in the unlikely event that you encounter a system with 8-byte ints, the extra one byte you provide for your digit array will not break you. The discrepancy arises from the difference between having (at most) 63 value bits in a signed 64-bit integer, and the formula accounting for 64 value bits in that case, with the result that sizeof(int) is a bit too much of an overestimation of the base-256 log of INT_MAX. The formula gives exact results for unsigned int up to at least size 8, provided there are no padding bits.

As a macro, then:

// Expands to an integer constant expression evaluating to a close upper bound
// on the number the number of decimal digits in a value expressible in the
// integer type given by the argument (if it is a type name) or the the integer
// type of the argument (if it is an expression). The meaning of the resulting
// expression is unspecified for other arguments.
#define DECIMAL_DIGITS_BOUND(t) (241 * sizeof(t) / 100 + 1)

关于c - 基于位数的 int 中的最大位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43787672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com