Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么在C中写100000000为1000*1000*1000?_Objective C_C_Integer_Literals - Fatal编程技术网

Objective c 为什么在C中写100000000为1000*1000*1000?

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

在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₁₀)
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
这是一个相对较新的特性,让语言意识到它们应该支持它(还有Perl)。正如chux@的优秀答案一样,
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无效的语法,顺便说一句,现代编程语言有另一种编写相同语法的方法,例如用Swift
1\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
$