和有什么区别目标-cC原始数字?我知道它们是什么以及如何使用它们(有点),但我不确定每个的功能和用途是什么。谁能弄清楚哪些最适合某些场景而不是其他场景?
我可以用每个存储什么?我知道有些可以存储更精确的数字,有些只能存储整数。比如说我想存储一个纬度(可能从一个CLLocation
对象中检索),我应该使用哪个来避免丢失任何数据?
我还注意到unsigned
每一个都有变体。这是什么意思,它与非无符号的原始数字有何不同?
苹果对此有一些有趣的文档,但它并不能完全满足我的问题。
和有什么区别目标-cC原始数字?我知道它们是什么以及如何使用它们(有点),但我不确定每个的功能和用途是什么。谁能弄清楚哪些最适合某些场景而不是其他场景?
我可以用每个存储什么?我知道有些可以存储更精确的数字,有些只能存储整数。比如说我想存储一个纬度(可能从一个CLLocation
对象中检索),我应该使用哪个来避免丢失任何数据?
我还注意到unsigned
每一个都有变体。这是什么意思,它与非无符号的原始数字有何不同?
苹果对此有一些有趣的文档,但它并不能完全满足我的问题。
嗯,首先,像int
, float
, double
,long
和等类型short
是C原语,而不是 Objective-C。您可能知道,Objective-C 是 C 的一种超集。Objective-CNSNumber
是所有这些类型的包装类。
因此,我将回答您关于这些 C 原语以及 Objective-C 如何解释它们的问题。基本上,每种数字类型都可以归入以下两个类别之一:整数类型和浮点类型。
它们只能存储整数(整数),并且具有两个特征:大小和符号。
大小是指一种类型需要在计算机中多少物理内存来存储,也就是多少字节。从技术上讲,为每种类型分配的确切内存取决于实现,但有一些保证:(1) char
将始终为 1 字节(2) sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
。
签名意味着,简单地说,类型是否可以表示负值。因此,有符号整数 orint
可以表示一定范围的负数或正数(传统上是 –2,147,483,648 到 2,147,483,647),而无符号整数 orunsigned int
可以表示相同范围的数字,但都是正数(0 到 4,294,967,295)。
这些用于存储十进制值(又名分数),也按大小分类。同样,您拥有的唯一真正保证是sizeof(float) <= sizeof(double) <= sizeof (long double)
. 浮点类型是使用一种相当特殊的内存模型存储的,这种模型很难理解,我不会深入讨论,但这里有一个很好的指南。
在RyPress上有一篇关于 Objective-C 上下文中 C 原语的精彩博客文章。许多介绍 CPS 的教科书也有很好的资源。
首先,我想指定 au unsigned int 和 an 之间的区别int
。假设您有一个非常高的数字,并且您编写了一个循环迭代unsigned int
:
for(unsigned int i=0; i< N; i++)
{ ... }
如果N
是一个用 定义的数字,它可能高于用代替#define
可存储的最大值。如果溢出将再次从零开始,并且您将进入无限循环,这就是我更喜欢使用for 循环的原因。 int
unsigned int
i
int
如果由于错误而使用 a 进行迭代int
,将其与 a 进行比较,也会发生同样的情况long
。如果N
是 along
您应该使用 a 进行迭代long
,但如果N
是 aint
您仍然可以安全地使用 a 进行迭代long
。
另一个可能发生的错误是当使用带有整数常量的移位运算符时,然后将其分配给int
or long
。也许您还记录sizeof(long)
并注意到它返回8
并且您不关心可移植性,因此您认为在这里不会丢失精度:
long i= 1 << 34;
相反,位不是1
a long
,因此它会溢出,并且当您将其转换为 long 时,您已经失去了精度。相反,您应该键入:
long i= 1l << 34;
较新的编译器会对此发出警告。
取自这个问题:Converting Long 64-bit Decimal to Binary。
关于float
并且double
有一点需要考虑:他们使用尾数和指数来表示数字。它是这样的:
值= 2^指数*尾数
所以指数越高,浮点数就越没有精确的表示。也可能发生一个数字太高,因此它的表示非常不准确,令人惊讶的是,如果你打印它,你会得到一个不同的数字:
float f= 9876543219124567;
NSLog("%.0f",f); // On my machine it prints 9876543585124352
如果我使用 adouble
它打印9876543219124568
,如果我使用long double
带有.0Lf
格式的 a 它打印正确的值。使用浮点数时要小心,可能会发生意想不到的事情。
例如,也可能发生两个浮点数具有几乎相同的值,您希望它们具有相同的值但存在细微差别,因此相等比较失败。但这已经在 Stack Overflow 上处理了数百次,所以我将发布此链接: 浮点和双重比较最有效的方法是什么?.