在Apple创建的代码中,有这一行:
1,000,000,000
有没有理由将1000*1000*1000
表达为1000^3
?
为什么不M13ProgressViewBar.m:216
呢?
答案 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位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;
对于可以完全表示为e
的值,也可以简单地使用double
表示法。当然,这会导致知道double
是否可以准确地表示整数值 - 值大于1e9的值。 (请参阅DBL_EPSILON
和DBL_DIG
)。
long Duration = 1000000000;
// vs.
long Duration = 1e9;
答案 3 :(得分:50)
为了便于阅读。
在零(1 000 000 000
或1,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
。
按照大致时间顺序,从最旧的支持到最新的支持:
"(1)1111 1111"
(apparently not for decimal values, only for bitstrings representing binary, quartal, octal or hexadecimal values)1$000$000
1_000_000_000
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