【问题标题】:So many ways to define a byte定义一个字节的方法有很多
【发布时间】:2012-06-12 08:17:49
【问题描述】:

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

unsigned char 来自...嗯..编译器?

uint8_t 来自 stdint.h

UInt8 来自 MacTypes.h

Byte 来自 MacTypes.h

Bytef 来自 zconf.h

我知道各种 def 是出于可移植性的原因,并且使用像 unsigned char 这样的字面量并不是一个好的未来想法(大小可能会改变,最终会再次像 Windows API 一样)。我想要一些关于如何找到最适合我用途的建议。或者如果我只是在傻的话,那就好好地鞭笞……

EDIT :只是为了获得更多信息,如果我想要一些总是为 1 字节的东西,我应该使用 uint8_t 吗(它似乎不会随着像这样的名字)?我想 UInt8 也不会改变,但我发现 UInt32 的定义因处理器是否为 64 位而异。

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

【问题讨论】:

标签: ios objective-c byte typedef


【解决方案1】:

完全无动于衷。无论您使用哪个,它最有可能最终成为unsigned char。不过,如果你想让它看起来不错,我建议你使用来自<stdint.h>uint8_t

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

(然而,char 并非必须是 8 位宽,只是如果一个类型的名称表明它是 8 位长,那么任何合理的实现都会确实将其 typedef . 顺便说一句,一个字节(char 是)通常是一个 8 位单元,即一个八位字节。)

【讨论】:

  • @borrrden uint8_t 永远不要更改,否则名称将完全错误。我认为这不会是一个糟糕的选择。它显示了您使用无符号字节变量的意图。
  • 一个潜在的讨厌的问题是,没有什么会禁止实现定义一个 8 位“扩展整数类型”并将 uint8_t 定义为它的别名。尽管给定uint16_t x=0xFFFF; 的实现需要使uint8_t y=*((unsigned char *)&x); 产生255,但如果表达式写成*((uint8_t*)&x) 并且uint8_t 被视为“非字符”类型,则不适用此类要求。
  • 对。 sizeof(char) == 1 但标准不要求 sizeof 的单位为 8 位字节(又名“八位字节”)。
【解决方案2】:

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

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

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

代码可读性

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

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

  • unsigned char - 这是什么???为什么 char 是要被签名的???
  • uint8_t - 好的,无符号 8 位整数
  • UInt8 - 嗯,同上
  • Byte - 有符号或无符号 8 位整数
  • Bytef - 这是什么?字节浮点数?那个“f”是什么意思?

这里很明显unsigned charBytef 不是一个好的选择。

更进一步,您会注意到 Byte 类型名称的另一个麻烦:您无法确定它是代表 signed 还是 unsigned 整数,当您尝试了解什么是整数时,这可能非常重要这个整数可以容纳的值的范围(-128 .. 127 或 0 .. 256)。这也没有增加代码的可读性。

统一的代码风格

我们现在只剩下 2 个类型名称:uint8_tUInt8。如何选择?

再次,从一个 Objective C 程序员的角度来看它们,他经常使用 NSIntegerNSUInteger 这样的类型名称,当他看到 UInt8 时看起来很自然。 uint8_t 看起来只是一个非常低级的令人生畏的东西。

结论

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

【讨论】:

  • “这是什么?字节浮点数?..”让我大笑:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多