为什么要在C中写1000,000,000 1000 * 1000 * 1000?
在Apple创build的代码中,有这样一行:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
有没有任何理由将1,000,000,000
1000*1000*1000
?
为什么不是1000^3
呢?
以乘法方式声明常量的一个原因是提高可读性,而运行时性能不受影响。 此外,为了表明作者正在乘数地考虑这个数字。
考虑一下:
double memoryBytes = 1024 * 1024 * 1024;
这显然比:
double memoryBytes = 1073741824;
因为后者乍看之下并不看1024的三分之一。
正如Amin Negm-Awad所提到的那样, ^
运算符是二元XOR
。 许多语言缺乏内置的编译时指数运算符,因此乘法运算。
为什么不是
1000^3
?
1000^3
的结果是1003. ^
是位XOR运算符。
即使它不处理Q本身,我补充说明。 x^y
并不总是像在提问者的例子中一样评价为x+y
。 你必须每一点都去。 在这个例子的情况下:
1111101000₂ (1000₁₀) 0000000011₂ (3₁₀) 1111101011₂ (1003₁₀)
但
1111101001₂ (1001₁₀) 0000000011₂ (3₁₀) 1111101010₂ (1002₁₀)
有理由不使用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
build议前导值与目标的可读性,可移植性和正确性的types相匹配。
double Duration = 1000.0 * 1000 * 1000; long long Duration = 1000LL * 1000 * 1000 * 1000;
也可以简单地使用e
符号来表示精确表示为double
。 当然这导致了知道double
能精确地表示整个数值 – 值大于1e9的值得关注。 (请参阅DBL_EPSILON
和DBL_DIG
)。
long Duration = 1000000000; // vs. long Duration = 1e9;
为了可读性。
在零( 1 000 000 000
或1,000,000,000
)之间放置逗号和空格会产生一个语法错误,并且在代码中有1000000000
1,000,000,000
使得很难确切地看到有多less个零。
1000*1000*1000
显然是10 ^ 9,因为我们的眼睛可以更容易地处理大块。 此外,没有运行时成本,因为编译器会将其replace为常量1000000000
。
为了可读性。 为了便于比较,Java支持_
以提高可读性(由Stephen Colebourne首先提出,作为对Derek Foster的build议:项目硬币的二进制文字 / JSR 334的回复 )。 你可以在这里写1_000_000_000
。
按照大致的时间顺序,从最古老的支持到最新的:
- XPL:
"(1)1111 1111"
( 显然不是十进制值,仅用于代表二进制,四进制,八进制或hex值的位串 ) - PL / M:
1$000$000
- Ada:
1_000_000_000
- Perl:同样
- Ruby:同样
- Fantom(以前范):同样
- Java 7:同样
- 斯威夫特:(同样?)
- Python 3.6
- C ++ 14:
1'000'000'000
对于语言来说,这是一个相对较新的特性,他们应该支持(然后是Perl)。 正如在chux @优秀的答案中, 1000*1000...
是一个部分解决scheme,但是打开程序员,即使最后的结果是一个大的types,也会出现由于乘法溢出而导致的错误。
可能会更简单地阅读并获得一些与1,000,000,000
forms的关联。
从技术方面来说,我猜在直接数字或乘法之间没有区别。 无论如何,编译器会将其生成为恒定的十亿个数字。
如果你讲的是objective-c,那么1000^3
将不起作用,因为没有pow的语法(这是异或)。 相反,可以使用pow()
函数。 但是在这种情况下,它不是最优的,它将是一个运行时函数而不是编译器生成的常量。
为了说明原因,请考虑以下testing程序:
$ 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中实现十进制数字效果的方法是使用文字浮点符号 – 只要double可以表示所需的数字而不会损失任何精度。
IEEE 754 64位double可以表示任何非负整数<= 2 ^ 53,没有问题。 通常情况下,长双(80或128位)甚至可以比这更进一步。 转换将在编译时完成,所以没有运行时间的开销,如果出现意外的精度损失,并且你有一个好的编译器,你可能会得到警告。
long lots_of_secs = 1e9;