Objective c 为什么在C中写100000000为1000*1000*1000?
在Apple创建的代码中,有这样一行:Objective c 为什么在C中写100000000为1000*1000*1000?,objective-c,c,integer,literals,Objective C,C,Integer,Literals,在Apple创建的代码中,有这样一行: CMTimeMakeWithSeconds(新持续时间秒,1000*1000*1000) 是否有任何理由将100000000表示为1000*1000*1000 为什么不1000^3 为什么不1000^3 1000^3的结果是1003^是位异或运算符 即使它不涉及Q本身,我也要澄清一下x^y不像提问者示例中那样总是计算为x+y。你必须对每一点进行异或运算。在本例中: 1111101000₂ (1000₁₀) 0000000011₂ (3₁₀) 111110
CMTimeMakeWithSeconds(新持续时间秒,1000*1000*1000)
是否有任何理由将100000000
表示为1000*1000*1000
为什么不1000^3
为什么不1000^3
1000^3
的结果是1003^
是位异或运算符
即使它不涉及Q本身,我也要澄清一下x^y
不像提问者示例中那样总是计算为x+y
。你必须对每一点进行异或运算。在本例中:
1111101000₂ (1000₁₀)
0000000011₂ (3₁₀)
1111101011₂ (1003₁₀)
但是
阅读和获取与
100000000
表单的关联可能更简单
从技术角度看,我想直接数和乘法之间没有区别。无论如何,编译器都会将其生成为常量十亿
如果您谈到objective-c,那么
1000^3
将不起作用,因为pow没有这样的语法(它是xor)。相反,可以使用pow()
函数。但在这种情况下,它将不是最优的,它将是一个运行时函数调用,而不是编译器生成的常量。以乘法方式声明常量的一个原因是提高可读性,同时运行时性能不受影响。
同时,表明作者以乘法的方式思考数字
考虑这一点:
double memoryBytes=1024*1024*1024;
这显然比:
double memoryBytes=1073741824;
因为后者看起来不像1024的三次方
正如Amin Negm Awad提到的,^
操作符是二进制的XOR
。许多语言缺少内置的编译时求幂运算符,因此缺少乘法。以提高可读性
在零之间放置逗号和空格(1000000000
或1000000000
)会产生语法错误,并且代码中包含1000000000
会使您很难准确地看到有多少个零
1000*1000*1000
表明这是10^9,因为我们的眼睛可以更容易地处理这些块。此外,没有运行时成本,因为编译器将用常量100000000
替换它 以提高可读性。相比之下,Java在数量上支持<代码>\,以提高可读性(首先由Stephen Colebourne提出,作为Coin/JSR 334项目的一部分)。人们会在这里写1000\u 000\u 000
按照大致的时间顺序,从最早的支持到最新的支持:
- XPL:
()“(1)1111111”
- 损益:
1$000$000
- Ada:
1\u 000\u 000
- Perl:同样
- 鲁比:同样
- 范汤姆(以前是范):同样
- Java 7:同样
- 斯威夫特:(一样?)
- Python 3.6
- C++14:
1'000'000'000
1000*1000…
是一个部分解决方案,但即使最终结果是一个大类型,程序员也会遇到乘法溢出的错误。有理由不使用1000*1000
对于16位int
,1000*1000
溢出。因此,使用1000*1000*1000
会降低可移植性
对于32位int
,以下第一行代码溢出
long long Duration=1000*1000*1000*1000;//溢流
长持续时间=1000000000000;//没有溢出,难以读取
建议lead值与目的地类型匹配,以确保可读性、可移植性和正确性
double Duration=1000.0*1000*1000;
长持续时间=1000LL*1000*1000*1000;
也可以简单地使用e
符号表示可精确表示为double
的值。当然,这会让我们知道double
是否能够准确地表示整数值——这是一个与大于1e9的值有关的问题。(请参见DBL\u EPSILON
和DBL\u DIG
)
long Duration=100000000;
//vs。
长持续时间=1e9;
为了说明原因,考虑下面的测试程序:
$ 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
$
$cat comma expr.c&&gcc-o comma expr comma expr.c&./comma expr
#包括
#定义亿万富翁1(1000000000)
#定义十亿2(1000^3)
int main()
{
printf(“%d,%d\n”,十亿分之一,十亿分之二);
}
0, 1003
$
在C语言中实现十进制数字类似效果的另一种方法是使用文字浮点表示法——只要双精度可以表示所需的数字而不损失任何精度
IEEE 754 64位双精度可以表示任何非负整数代码的清晰度和可读性。在C中不能将或作为分隔符,因此下一个最好的方法是通过乘法计算值。^是C-异或中的一个无关运算符。它特别用于持续时间,如:2*60*60。。很容易注意到这是2个小时。对于一个我怀疑100000000无效的语法,顺便说一句,现代编程语言有另一种编写相同语法的方法,例如用Swift1\u 000\u 000
。然而,对于时间常数,这是更困难的。写30*60
(30分钟秒)比写1800
可读性更强。实际上,有一些语言可以让你写单位,例如,米
,这样你就可以保护自己不受错误赋值的影响。^
是一个异或,而不是指数或幂运算符。先生,我不清楚1003^3是如何变成1003的。Google和Mac计算器显示1000^3=100000000。你能解释一下吗?^
运算符在C/C++/Objective-C等中表示XOR。在计算器中,它通常表示x到y
$ 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
$