3

和有什么区别目标-cC原始数字?我知道它们是什么以及如何使用它们(有点),但我不确定每个的功能和用途是什么。谁能弄清楚哪些最适合某些场景而不是其他场景?

我可以用每个存储什么?我知道有些可以存储更精确的数字,有些只能存储整数。比如说我想存储一个纬度(可能从一个CLLocation对象中检索),我应该使用哪个来避免丢失任何数据?

我还注意到unsigned每一个都有变体。这是什么意思,它与非无符号的原始数字有何不同?

苹果对此有一些有趣的文档,但它并不能完全满足我的问题。

4

2 回答 2

4

嗯,首先,像int, float, double,long和等类型shortC原语,而不是 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 的教科书也有很好的资源。

于 2013-07-18T21:35:38.953 回答
1

首先,我想指定 au unsigned int 和 an 之间的区别int。假设您有一个非常高的数字,并且您编写了一个循环迭代unsigned int

for(unsigned int i=0; i< N; i++)
{ ... }

如果N是一个用 定义的数字,它可能高于用代替#define可存储的最大值。如果溢出将再次从零开始,并且您将进入无限循环,这就是我更喜欢使用for 循环的原因。 intunsigned intiint

如果由于错误而使用 a 进行迭代int,将其与 a 进行比较,也会发生同样的情况long。如果N是 along您应该使用 a 进行迭代long,但如果N是 aint您仍然可以安全地使用 a 进行迭代long

另一个可能发生的错误是当使用带有整数常量的移位运算符时,然后将其分配给intor long。也许您还记录sizeof(long)并注意到它返回8并且您不关心可移植性,因此您认为在这里不会丢失精度:

long i= 1 << 34;

相反,位不是1a 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 上处理了数百次,所以我将发布此链接: 浮点和双重比较最有效的方法是什么?.

于 2013-07-18T21:51:05.937 回答