为什么要在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位int1000 * 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_EPSILONDBL_DIG )。

 long Duration = 1000000000; // vs. long Duration = 1e9; 

为了可读性。

在零( 1 000 000 0001,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,000forms的关联。

从技术方面来说,我猜在直接数字或乘法之间没有区别。 无论如何,编译器会将其生成为恒定的十亿个数字。

如果你讲的是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;