为什么在C中写入1000,000,000作为1000 * 1000 * 1000?

时间:2016-11-16 13:12:47

标签: objective-c c integer literals

在Apple创建的代码中,有这一行:

1,000,000,000

有没有理由将1000*1000*1000表达为1000^3

为什么不M13ProgressViewBar.m:216呢?

8 个答案:

答案 0 :(得分:193)

以乘法方式声明常量的一个原因是提高可读性,而运行时性能不受影响。 此外,表明作者正在考虑数字的乘法方式。

考虑一下:

double memoryBytes = 1024 * 1024 * 1024;

它明显优于:

double memoryBytes = 1073741824;

因为后者乍看之下并没有看到1024的第三个力量。

正如Amin Negm-Awad所提到的,^运算符是二进制XOR。许多语言缺少内置的编译时取幂运算符,因此是乘法。

答案 1 :(得分:72)

  

为什么不1000^3

1000^3的结果是1003. ^是bit-XOR运算符。

即使它没有处理Q本身,我也补充说明。 x^y 始终评估为x+y,就像在提问者的示例中一样。你必须xor每一点。在示例的情况下:

1111101000₂ (1000₁₀)
0000000011₂ (3₁₀)
1111101011₂ (1003₁₀)

但是

1111101001₂ (1001₁₀)
0000000011₂ (3₁₀)
1111101010₂ (1002₁₀)

答案 2 :(得分:63)

有使用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

建议前导值与目标类型相匹配,以提高可读性,可移植性的正确性。

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;

答案 3 :(得分:50)

为了便于阅读。

在零(1 000 000 0001,000,000,000)之间放置逗号和空格会产生语法错误,并且代码中包含1000000000会让人很难确切地看到有多少个零。

1000*1000*1000表明它是10 ^ 9,因为我们的眼睛可以更容易地处理这些块。此外,没有运行时成本,因为编译器将使用常量1000000000替换它。

答案 4 :(得分:25)

为了便于阅读。为了进行比较,Java在数量上支持_以提高可读性(首先由Stephen Colebourne提出,作为Project Coin / JSR 334的reply to Derek Foster's PROPOSAL: Binary Literals)。有人会在这里写1_000_000_000

按照大致时间顺序,从最旧的支持到最新的支持:

这是一种相对较新的功能,语言实现它们应该支持(然后是Perl)。正如chux @的优秀答案一样,1000*1000...是一个部分解决方案,但即使最终结果是一个大类型,也会使编程人员遇到错误而导致错误溢出。

答案 5 :(得分:6)

可能更容易阅读并与1,000,000,000表单建立关联。

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

如果你谈论objective-c,那么1000^3将无效,因为pow没有这样的语法(它是xor)。相反,可以使用pow()函数。但在这种情况下,它将不是最优的,它将是一个运行时函数调用而不是编译器生成的常量。

答案 6 :(得分:2)

为了说明原因,请考虑以下测试程序:

$ 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
$

答案 7 :(得分:0)

在C中为十进制数实现类似效果的另一种方法是使用文字浮点表示法 - 只要double可以表示您想要的数字而不会丢失任何精度。

IEEE 754 64位双精度可以表示任何非负整数&lt; = 2 ^ 53而没有问题。通常,长双(80或128位)可以比这更进一步。转换将在编译时完成,因此没有运行时开销,如果出现意外的精度损失并且您有一个好的编译器,您可能会收到警告。

def create
...
    @ratinglog = RatingLog.create
        @ratinglog.user = current_user
        @ratinglog.rating = @rating.id
        @ratinglog.comment_type = "server generated"
        @ratinglog.comment = "#{current_user.fname} #{current_user.lname} submitted a rating of #{@rating.content}"
        @ratinglog.save!
...
end