繁体   English   中英

使用和何时使用 int16_t、int32_t、int64_t 和分别为 short int、int、long int、long

[英]Uses and when to use int16_t,int32_t,int64_t and respectively short int,int,long int,long

使用和何时使用int16_tint32_tint64_t以及分别为shortintlong
C++ 中该死的类型太多了。对于整数,什么时候使用一个而不是另一个是正确的?

当精度很重要时,使用定义良好的类型。 当它不是时使用不太确定的。 使用更精确的永远不会错。 当您使用灵活的时,有时会导致错误。

当您确实需要精确宽度时,请使用精确宽度类型。 例如, int32_t保证正好是 32 位宽,没有填充位,并且使用二进制补码表示。 如果您需要所有这些要求(可能是因为它们是由外部数据格式强加的),请使用int32_t 对于其他[u]intN_t类型也是如此。

如果您只需要至少32 位的有符号整数类型,请使用int_least32_tint_fast32_t ,具体取决于您要优化大小还是速度。 (它们很可能是同一类型。)

当预定义类型shortintlong等对您的目的足够好并且您不想使用较长的名称时,请使用它们。 shortint都保证至少为 16 位, long至少为 32 位, long long至少为 64 位。 int通常是系统架构建议的“自然”整数类型; 你可以把它看作int_fast16_t ,并longint_fast32_t ,虽然他们不能保证是相同的。

我没有给出使用内置与[u]int_leastN_t[u]int_fastN_t类型的严格标准,因为坦率地说,没有这样的标准。 如果选择不是由您使用的 API 或组织的编码标准强加的,那么这实际上是个人品味的问题。 尽量保持一致。

这是个好问题,但很难回答。
在一行中:这取决于上下文:

我的经验法则:

  • 我更喜欢代码性能(速度:更少的时间,然后降低复杂性)
  • 使用现有库时,我会遵循库编码风格(上下文)。
  • 在团队中编码时,我会遵循团队编码风格(上下文)。
  • 在编码新事物时,我会int16_t,int32_t,int64_t,..使用int16_t,int32_t,int64_t,..

说明:

在某些情况下使用intint是系统字长)可以为您提供性能,但在其他某些情况下则不然。

我会在unsigned long long使用uint64_t ,因为它很简洁,但unsigned long long有可能。

所以这取决于上下文

我发现它们的一个用途是当我为图像压缩器等位打包数据时。 使用这些精确指定字节数的类型可以省去很多麻烦,因为C++ 标准没有明确定义其类型中的字节数,只有 MIN 和 MAX 范围。

在 MISRA-C 2004 和 MISRA-C++ 2008 指南中,建议首选特定长度的类型定义:

指示大小和符号的typedef应该用来代替基本的数字类型。 [...]

此规则有助于明确存储的大小,但由于积分提升的不对称行为,无法保证可移植性。 [...]

char 类型除外:

字符类型应仅用于字符值的存储和使用。

但是,请记住 MISRA 指南适用于关键系统。

就个人而言,我遵循这些针对嵌入式系统的指南,而不是针对计算机应用程序,在我需要 integer 时我只是使用int ,让编译器根据需要进行优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM