【问题标题】:Exact width integers in C++/Qt: Is typedef int qint32 really correct?C++/Qt 中的精确宽度整数:typedef int qint32 真的正确吗?
【发布时间】:2012-05-21 20:21:51
【问题描述】:

Qt 文档说:

typedef qint8

有符号字符的类型定义。此类型保证在 Qt 支持的所有平台上都是 8 位的。

typedef qint16

Typedef 为有符号的缩写。此类型保证在 Qt 支持的所有平台上都是 16 位的。

typedef qint32

有符号整数的类型定义。此类型保证在 Qt 支持的所有平台上都是 32 位的。

typedef qint64

用于 long long int 的 Typedef(Windows 上的 __int64)。此类型保证在 Qt 支持的所有平台上都是 64 位的。

类型在qglobal.h中定义如下:

/*
   Size-dependent types (architechture-dependent byte order)
   Make sure to update QMetaType when changing these typedefs
*/
typedef signed char qint8;         /* 8 bit signed */
typedef unsigned char quint8;      /* 8 bit unsigned */
typedef short qint16;              /* 16 bit signed */
typedef unsigned short quint16;    /* 16 bit unsigned */
typedef int qint32;                /* 32 bit signed */
typedef unsigned int quint32;      /* 32 bit unsigned */
//....

但我想知道(例如)qint32 在不能保证 int 是 32 位长的情况下总是可以是 32 位长。 据我所知,在 64 位架构上,ints 是(或至少可以是)64 位长。 [编辑:我错了。请参阅下面的 cmets。]

他们如何保证尺寸?他们为什么不使用stdint(以及Windows平台上的__intN)?

【问题讨论】:

  • 这不一定适用于所有平台,只适用于 Qt 支持的所有平台。
  • 是的,但是 Qt 也支持 64 位平台。
  • @leemes - int 在这些平台上仍然是 32 位。但long 可能会有所不同。
  • @BoPersson 好的,谢谢,我不知道。对不起,有点离题的问题:在 64 位平台上,int 是否与 64 位 long 一样快?
  • @leemes - 在 Qt 支持的平台(x86-64?)上,int 操作比 64 位值短一个字节,使用的数据更少。这可能会使其更快。另一方面,一个 64 位运算处理两倍的数据量,如果你需要它

标签: c++ qt cross-platform


【解决方案1】:

他们如何保证尺寸?

他们针对的是他们知道上述定义有效的特定平台。 Qt 不关心其他平台,other platforms 不关心 Qt。所以,它并不总是有效。但在它不起作用的地方,Qt 也不会。

他们为什么不使用 stdint(以及 Windows 平台上的 __intN)?

有时,为您自己的项目维护 <stdint.h> 中的 typedef 比在拥有它的平台上有条件地包含标准头文件更简单并且仍然为没有它的平台维护一个后备(例如VS2005)。

【讨论】:

    【解决方案2】:

    Qt 支持许多平台,但重要的是平台的 64 位数据模型(或者更准确地说,编译器加平台的数据模型)。​​

    大多数常见的 64 位平台使用 32 位整数,因为它们实现了某种形式的 LP64 数据模型。基于 ILP64 的数据模型(ILP64、SILP64 等)将整数定义为 64 位。但我不相信 Qt 支持这些platforms

    查看ILP64 wiki page 和这个support page for PVS-Studio,它们有一些很好的技术信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-24
      • 2023-03-05
      • 1970-01-01
      • 2013-01-10
      • 2021-10-09
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      相关资源
      最近更新 更多