25

我在objective-c中使用哪个(特别是在iOS上)有什么不同吗?我假设它来自从 C 及其类型继承,以及从 iOS 所基于的 Mac OS 继承类型,但我不知道应该使用哪一个:

unsigned char从...嗯..编译器?

uint8_t来自 stdint.h

UInt8来自 MacTypes.h

Byte来自 MacTypes.h

Bytef来自 zconf.h

我知道各种 defs 是出于可移植性的原因,并且使用类似unsigned char的文字并不是好的未来想法(大小可能会改变,事情最终会像 Windows API 一样)。我想要一些关于如何找到最适合我使用的建议的建议。或者,如果我只是傻的话,我会狠狠地鞭笞……

编辑:只是为了获得更多信息,如果我想要一些永远是 1 字节的东西,我应该使用 uint8_t (看起来它不会用这样的名字改变)?我想 UInt8 也不会改变,但我看到 UInt32 的定义因处理器是否为 64 位而异。

进一步编辑:当我说字节时,我的意思是我想要 8 位。我正在为磁盘存储进行像素压缩操作(32 位-> 8 位)。

4

2 回答 2

11

这是完全无动于衷的。无论您使用哪个,它很可能最终会成为unsigned char. 但是,如果您希望它看起来不错,我建议您使用uint8_tfrom <stdint.h>

两者都不会随着架构而改变。char根据 C 标准,它始终为 1 个字节,如果在实现中 UInt8 突然变成 16 位长,那么从用户的角度来看,这将是不支持的。

(然而,情况并非如此,它char必须是 8 位宽,只是如果一个类型的名称表明它是 8 位长,那么任何明智的实现确实会对其进行 typedef。顺便说一下,一个字节 (即char)通常是一个 8 位单元,即一个八位字节。)

于 2012-06-08T09:15:24.383 回答
1

与从 C 语言类型模型派生的每种编程语言一样,Objective C 有一些等效的选项来声明一个 8 位整数。

为什么我说等价?因为正如 OP 正确陈述的那样,很明显所有这些选项最终都被编译typedefunsigned char内置编译器类型。现在这是正确的,让我们实际来说,没有人会在未来将它们更改为非 8 位整数。

所以,这里的实际问题是在为 8 位整数选择类型名称时优先考虑的更好顺序是什么?

代码可读性

由于基本上在每个具有C语言根的代码中,原始类型名称都是一团糟。因此,可能最重要的因素是可读性。我的意思是对于大多数阅读您的代码的人来说,为这个特定整数选择这个特定类型的明确且唯一可识别的意图。

因此,让我们从对 C 语言知之甚少的普通 Objective C 程序员的角度来看看这些类型。

  • unsigned char- 这是什么???为什么 char 意味着要签名???
  • uint8_t- 好的,无符号 8 位整数
  • UInt8- 嗯,和上面一样
  • Byte- 有符号或无符号 8 位整数
  • Bytef- 这是什么?字节浮点数?那个'f'是什么意思?

很明显,这unsigned char不是Bytef一个好的选择。

更进一步,您会注意到Byte类型名称的另一个麻烦:您无法确定它是否代表signedunsigned整数,当您试图了解该整数可以容纳的值范围是多少时(-128 . . 127 或 0 .. 256)。这也没有增加代码的可读性。

统一的代码风格

我们现在剩下 2 个类型名称:uint8_tUInt8. 如何在它们之间进行选择?

再一次,通过一个 Objective C 程序员的眼睛来看它们,他使用的类型名称很多NSIntegerNSUInteger当他看到 . 时看起来很自然UInt8uint8_t只是看起来像一个非常低级的令人生畏的东西。

结论

因此,我们最终只剩下一个选项 - UInt8。就位数、范围和外观而言,这是可以清楚地识别的。所以这里可能是最好的选择。

于 2017-06-20T21:58:40.893 回答