提问人:Duck 提问时间:11/16/2016 最后编辑:LaurelDuck 更新时间:2/5/2023 访问量:15918
为什么要在 C 中将 1,000,000,000 写为 1000*1000*1000?
Why write 1,000,000,000 as 1000*1000*1000 in C?
问:
在 Apple 创建的代码中,有这样一行:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
有什么理由表示为?1,000,000,000
1000*1000*1000
为什么不呢?1000^3
答:
为什么不呢?
1000^3
的结果是 1003. 是位异或运算符。1000^3
^
即使它不涉及 Q 本身,我也会添加一个澄清。 并不总是像提问者示例中那样评估 to。你必须xor每一点。在示例中:x^y
x+y
1111101000₂ (1000₁₀)
0000000011₂ (3₁₀)
1111101011₂ (1003₁₀)
但
1111101001₂ (1001₁₀)
0000000011₂ (3₁₀)
1111101010₂ (1002₁₀)
评论
^
可能更易于阅读并获得与表单的一些关联。1,000,000,000
从技术方面来看,我想直接数或乘法之间没有区别。无论如何,编译器都会将其生成为常量十亿数。
如果你谈论 objective-c,那么将不起作用,因为 pow 没有这样的语法(它是 xor)。相反,可以使用函数。但在这种情况下,它不会是最优的,它将是一个运行时函数调用,而不是编译器生成的常量。1000^3
pow()
以乘法方式声明常量的一个原因是提高可读性,同时不受运行时性能的影响。 此外,表明作者正在以乘法方式思考这个数字。
考虑一下:
double memoryBytes = 1024 * 1024 * 1024;
这显然比:
double memoryBytes = 1073741824;
因为后者乍一看不是 1024 的第三次方。
正如 Amin Negm-Awad 所提到的,运算符是二进制 。许多语言缺少内置的编译时幂运算符,因此需要乘法。^
XOR
评论
x
为了可读性。
在零 ( 或 ) 之间放置逗号和空格会产生语法错误,并且代码中包含会使得很难确切地看到有多少个零。1 000 000 000
1,000,000,000
1000000000
1000*1000*1000
很明显它是 10^9,因为我们的眼睛可以更容易地处理块。此外,没有运行时成本,因为编译器会将其替换为常量 .1000000000
评论
1,000,000,000
CMTimeMakeWithSeconds( newDurationSeconds, 1,000,000,000 )
1_000_000_000
_
'
1'000'000'000
1,000,000,000
_1_000_000_000
为了可读性。为了进行比较,Java 支持数字以提高可读性(首先由 Stephen Colebourne 提出,作为对 Derek Foster 的 PROPOSAL: Binary Literals for Project Coin/JSR 334) 的回复。有人会写在这里。_
1_000_000_000
大致按时间顺序,从最旧的支持到最新的支持:
- XPL:(显然不适用于十进制值,仅适用于表示二进制、四进制、八进制或十六进制值的位字符串
"(1)1111 1111"
) - PL/M:
1$000$000
- 艾达:
1_000_000_000
- Perl:同样
- Ruby:同样
- Fantom(前身为 Fan):同样
- Java 7:同样
- 斯威夫特:(一样?
- Python 3.6 中文文档
- C++ 14:
1'000'000'000
对于语言来说,这是一个相对较新的功能,可以意识到它们应该支持(然后是Perl)。正如 chux@ 的出色回答一样,这是一个部分解决方案,但即使最终结果是一个大类型,程序员也会因乘法溢出而面临错误。1000*1000...
评论
有理由不使用 .1000 * 1000 * 1000
使用 16 位 ,溢出。因此,使用会降低可移植性。int
1000 * 1000
1000 * 1000 * 1000
使用 32 位时,以下第一行代码会溢出。int
long long Duration = 1000 * 1000 * 1000 * 1000; // overflow
long long Duration = 1000000000000; // no overflow, hard to read
建议潜在客户值与目标的类型匹配,以提高可读性、可移植性和正确性。
double Duration = 1000.0 * 1000 * 1000;
long long Duration = 1000LL * 1000 * 1000 * 1000;
此外,代码可以简单地使用表示法来表示完全可以表示为 .当然,这导致知道是否可以准确表示整数值 - 对于大于 1e9 的值,这是值得关注的。(请参阅和)。e
double
double
DBL_EPSILON
DBL_DIG
long Duration = 1000000000;
// vs.
long Duration = 1e9;
评论
double
double
1000
1000000000000
int
long
long long
1000 * 1000 * 1000 * 1000
int
1000
int
int
1000000000000
long long
long long Duration
int
long x = 1000 * 1000 * 1000L;
long x = 1000L * 1000 * 1000;
为了说明原因,请考虑以下测试程序:
$ cat comma-expr.c && gcc -o comma-expr comma-expr.c && ./comma-expr
#include <stdio.h>
#define BILLION1 (1,000,000,000)
#define BILLION2 (1000^3)
int main()
{
printf("%d, %d\n", BILLION1, BILLION2);
}
0, 1003
$
评论
在 C 语言中实现十进制数类似效果的另一种方法是使用文字浮点表示法——只要双精度可以表示您想要的数字而不会损失任何精度。
IEEE 754 64 位双精度可以毫无问题地表示任何非负整数 <= 2^53。通常,长双精度(80 或 128 位)可以走得更远。转换将在编译时完成,因此没有运行时开销,如果出现意外的精度损失并且您有一个良好的编译器,您可能会收到警告。
long lots_of_secs = 1e9;
评论
1_000_000_000
30 * 60
1800
meters
^
是异或,而不是指数或幂运算符。