uint32_t vs uint_fast32_t vs uint_least32_t

2024-04-11

我在中看到了不同类型的整数定义stdint.h。我将以无符号 32 位整数为例。

  1. uint32_t显然意味着 32 位无符号整数。这是我经常使用的。

  2. uint_fast32_t and uint_least32_t: 和有什么区别uint32_t我什么时候应该使用它们而不是uint32_t ?

而现在,我看到了uintX_t其中 X 是 24、40、48 和 56。在我的代码中,我必须使用 48 和 56 位整数。举个例子,我想uint24_t定义如下:

struct uint24_t { unsigned int the_integer : 24; };

我对吗 ?而且,你会建议我使用uint48_t对于我的 48 位无符号整数,或者我应该使用普通的uint64_t ?

感谢您的解释。


与 uint32_t 有什么区别

uint_fast32_t是至少 32 位的无符号类型,它(以某种通用方式)是此类类型中最快的。 “快速”意味着如果有选择,实现者可能会选择架构具有算术、加载和存储指令的大小。它不是任何特定基准的获胜者。

uint_least32_t是至少 32 位的最小无符号类型。

uint32_t是一种没有填充的 32 位类型(如果存在此类类型)。

我对吗?

No. If uint24_t存在的话它是一个整数类型,而不是一个struct。如果此实现中不存在 24 位无符号整数类型,则它不存在。

Since unsigned long要求至少为 32 位,这是唯一的标准类型uint24_t可能是 are 的别名char, unsigned char, unsigned short and unsigned int。或者,它可以是扩展类型(即,实现提供的整数类型不是标准中定义的任何整数类型)。

您会建议我对 48 位无符号整数使用 uint48_t 吗?

如果它存在并且是您想要的大小,那么您不妨使用它。但是,它不会存在于很多实现中,因此它仅适合在不可移植代码中使用。没关系,只要您必须处理精确的 48 位整数的原因是特定于平台的。

确切的 16、32 和 64 位类型在技术上也是可选的,但如果实现具有合适的整数类型,则需要它们存在。 “合适”不仅意味着存在精确的N位无符号类型且没有填充位,而且还意味着对应的有符号类型没有填充位并且使用2的补码表示。实际上,这与任何地方都非常接近,因此使用它们中的任何一个都几乎不会限制可移植性。为了获得最大的便携性,尽管您应该使用uint_least32_t or uint_fast32_t优先于uint32_t。哪一个取决于你更关心速度还是大小。根据我的经验,很少有人会为此烦恼,因为没有 32 位整数类型的平台已经很奇怪,以至于大多数人不关心他们的代码是否在其上运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uint32_t vs uint_fast32_t vs uint_least32_t 的相关文章

  • return 语句是否为按值返回的函数创建临时对象?

    当我学习 C 11 右值引用和移动语义时 我开始对函数如何返回值来初始化变量感到困惑 看下面的例子 Widget makeWidget Widget w return w Widget w1 makeWidget 这里我假设没有 RVO 即
  • 是否已经有一些基于 std::vector 的 set/map 实现?

    对于小型集合或地图 通常使用排序向量而不是基于树的向量要快得多set map 特别是对于 5 10 个元素的情况 LLVM 有一些类本着这种精神 http llvm org docs ProgrammersManual html ds se
  • 从对象中获取类型正在返回运行时类型[重复]

    这个问题在这里已经有答案了 我有一个简单的功能 public string getType object obj Type type obj getType return type FullName 如果您在运行时创建的字符串对象上使用此函
  • Qml 中的 FileDialog 在发布中不起作用

    我正在与以下项目合作Qt Quick Control 2 当我尝试在调试模式下运行软件时 FileDialog qml 可以完美打开 但是当我将其部署为发布模式时 它无法工作 这是我的代码 import QtQuick 2 4 import
  • 将 CryptoStream 解密为 MemoryStream

    我编写了一个过程 其中文件被加密并上传到 Azure 然后必须解密下载过程 这会失败并出现 填充无效且无法删除 错误 或 要解密的数据长度为无效的 错误 我在网上尝试了很多解决方案 包括C 使用 RijndaelManaged 和 Cryp
  • 如何创建 .bat 文件来运行 C# 代码?

    我需要的是 我有一个 C 代码 我想构建它以便在桌面上创建一个 bat 文件 因此 当我从桌面运行这个 bat 文件时 它应该执行 C 代码 有没有办法在编译之前更改 c 项目的设置或属性 以便创建应运行此 c 代码的 bat 文件 将 C
  • 在 Python 中将 int 转换为 ASCII 并返回

    我正在为我的网站制作一个 URL 缩短器 我当前的计划 我愿意接受建议 是使用节点 ID 来生成缩短的 URL 因此 理论上 节点 26 可能是short com z 节点 1 可能是short com a 节点 52 可能是short c
  • 有没有一种方法可以在不测试整个应用程序的情况下对类库(通用 Windows)进行单元测试?

    我需要进行单元测试Class Library Universal Windows 但是从 添加新项目 窗口中 我只看到了这一点 该项目使用应用程序容器运行所有测试 它始终打开一个应用程序 由于我不需要所有这些开销 我想知道是否有一种方法可以
  • 这个对象的内存会是什么样子?

    我想知道这个类 它的对象 的内存布局是什么样的 class MyClass string myString int myInt public MyClass string str int i myString str myInt i MyC
  • 如何对具有无效值的属性使用 JSON.net 的默认值

    我正在使用 Newtonsoft JSON 库来反序列化来自 Web 服务的响应 问题是某些字段包含无效值 例如 一条记录上的一个字段包含一个 T 表示该字段应该是数字 我想做的是将无效字段的值设置为 null 或其他默认值 我的所有属性都
  • 枚举和枚举类之间的区别[重复]

    这个问题在这里已经有答案了 谁能解释一下两者之间的区别 enum Type1 type2 And enum class Type1 type2 我经常使用前者 可能太频繁而没有足够的封装 但我从未使用过第二个例子 Thanks enum A
  • Windows Phone 8.1 应用程序多语言

    我正在使用 Visual Studio 2015 在 SilverLight 中创建 Windows Phone 应用程序 8 1 我正在用英语和阿拉伯语创建多语言应用程序 为此 我在项目中创建了 Strings 文件夹 其中包含 en U
  • 验证仅适用于数组的第一项

    给定这个模型代码 Required Display Name Name public string Name get set 以下查看代码有效 Html LabelFor model gt model Name Html TextBoxFo
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 为什么这是一个未定义的行为?

    我的回答这个问题 https stackoverflow com q 18706587 845092这个函数是 inline bool divisible15 unsigned int x 286331153 2 32 1 15 40086
  • C# SerialPort BaseStream ReadAsync - CancellationToken 从未取消?

    我尝试以异步方式从串行端口读取数据 请记住操作所花费的时间不得超过指定的时间段 我使用的代码 private async Task
  • LINQ 中的左外连接

    下面的代码不断给我一个错误消息 你调用的对象是空的 var partsWithDefaults from partsList1 in p join partsList2 in d on new PartNo partsList1 PartN
  • Web 服务无法使用 GAC 中的类型创建类型错误

    遇到一个不寻常的问题时 我似乎喜欢做一些不常见的事情 我有一个复合控件 它检查给定的 Web 服务文件是否存在于我的应用程序的根目录中 如果不存在 它会在标记中创建带有必要指令的文件以进行滚动 如下所示 反过来 它被保存到输出中 完成此步骤
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca

随机推荐