- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我需要一个常量值来表示 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 int
s, 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/
假设我得到了两个整数 a, b 其中 a 是一个正整数并且小于 b 。我必须找到一种有效的算法,它会在 [a, b] 区间内给出 base2 位数(位数)的总和。例如,在区间 [0, 4] 中,数字之
到目前为止我已经尝试过不同的 autofilter但非选项似乎对我有用,我有许可证号列,其中应该只有 10 位数字,并且 autofilter我正在尝试查找少于或多于 10 位数字的条目, 我将该列转
谁能告诉我检查输入的数字是否为 3 位数字的正则表达式...它也不应该允许字母.... 最佳答案 3 个数字的正则表达式为 ^[0-9]{3}$ 或 ^\d{3}$ 关于javascript - 是否
我不知道这在 SQL Server 中是否可行,但我得问问它 ;-) 我在表 work 中有一个名为 duty 的列。 假设 Work.Duty 包含不同的数字,例如 (1, 2, 3, 20, 22
我正在运行一个我创建的java程序,它存储用户输入的数据。具体来说,有 4 个数组列表,分别是songName、songArtist、songYear 和songAlbum。我有一个“songYear
我不知道这在 SQL Server 中是否可行,但我得问问它 ;-) 我在表 work 中有一个名为 duty 的列。 假设 Work.Duty 包含不同的数字,例如 (1, 2, 3, 20, 22
给定一个 float ,我想使用半偶数舍入将结果四舍五入到小数点后四位,即四舍五入到下一个偶数的方法。例如,当我有以下代码片段时: #include #include int main(){
有没有一种方法可以在不使用小程序的情况下确定客户端计算机上的 jvm 位数?我确实看到了这个link但这决定了 jvm 版本而不是位数。提前致谢 最佳答案 您可以尝试确定浏览器位数 - 32 位 ja
我正在编写一个程序来计算给定数字的两个二进制表示之间的共同位数。我写的代码是: int common_bits(int a, int b) { static long binaryNo1,binary
如何使表格中的每个单元格的最小宽度为 3 位数字并且不会更大?现在我正在对 min-width 进行硬编码,但我不喜欢对值进行硬编码,因为将来我可能想更改字体。如果需要 Javascript 也没关系
我正在尝试匹配后跟一个空格或制表符和 5 个数字的单词。例如 some noise text off 12345 some noise text again. 另一个例子是: Some noise t
我在从 double 到 string 的转换时遇到问题。 我要转换: double value: 0.0772486324655191 string value: 0.077248632465519
我正在尝试实现一个使用 128 位 key 的密码。 key 计划的一部分是将 key 向右旋转 29 位,但我不确定该怎么做,因为 Java 中没有单一数据类型可以保存整个 key 。我将它存储在两
我正在尝试在 AVX2 中对 128 位数进行左旋转。由于没有直接的方法,我尝试使用左移和右移来完成我的任务。 这是我执行相同操作的代码片段。 l = 4; r = 4
我有一个 int,它的值类似于 1235 和 12890。我只想要这个 int 的前 2 位数字。我怎样才能提取它? 想了半天,想不出什么办法。 最佳答案 减少数字,直到只剩下两位数: while (
TL:DR 我想要紧跟“+”符号的任何行上的前两个数字的语法。 给定以下文本(来自熟悉的实用程序): power_meter-acpi-0 Adapter: ACPI interface power1
因此根据 cplusplus.com,当您通过以下方式将输出流的格式标志设置为科学记数法时 of.setf(ios::scientific) 您应该在指数中看到 3 位加号和一个符号。但是,我的输出似
这个问题在这里已经有了答案: How can I pad a value with leading zeros? (77 个答案) 关闭 9 年前。 如果小时数小于 10 小时,则小时数通常以个位数
我正在使用 moment.js使用根据距离/速度计算的日期时间。我也在使用 moment duration format plugin .当我将值传递给 moment.duration 然后对其进行格
我正在将一个应用程序从 .NET 移植到 Mono 运行时,并且在代码中的某个位置我可以看到一个 float 具有值 158136.422。我对 float 的理解是它是 7 位精度,那么这个数字如何
我是一名优秀的程序员,十分优秀!