问题标签 [stdint]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C 类型声明 intN_t
标头 stdint.h 如何在每台机器上将 u32 定义为 32 位?有人可以详细说明 stdint.h 为实现这一目标所做的过程吗?在哪里可以找到我的机器 (Windows 7) 的 stdint.h 文件?
c++ - 现代 C++ 中 uintptr_t 类型的头文件是什么?
我发现在 C99 中你应该#include <stdint.h>
并且这似乎也适用于我的 C++03 gcc 编译器,但这是现代 C++ 的正确头文件,它是否可移植?
c++ - 为什么 Microsoft Visual Studio 找不到?
请参阅以下来自wiki的文本:
C99 标准包括几个新整数类型的定义,以增强程序的可移植性[2]。已经可用的基本整数类型被认为是不够的,因为它们的实际大小是实现定义的,并且可能因不同的系统而异。新类型在硬件通常只支持几种类型并且支持因系统而异的嵌入式环境中特别有用。所有新类型都在 inttypes.h 头文件(C++ 中的 cinttypes 头文件)中定义,并且在 stdint.h 头文件(C++ 中的 cstdint 头文件)中可用。这些类型可以分为以下几类:
我的视觉工作室找不到任何这些文件:
<cstdint>
<cinttypes>
<stdint.h>
<inttypes.h>
为什么?
c++ - 对比
stdint.h
和 和有什么不一样cstdint
?
它们都在 MSVC (Visual Studio 2010) 和 gcc-4.5.1 中可用。还都定义了intX_t
/uintX_t
类型(其中类型X
的大小以字节为单位)。
- 如果两个标题中的基本原理相同(便携式类型),我必须做出哪些决定来决定其中一个?
stdint.h
定义了没有任何命名空间的每个类型,类型cstdint
位于std
命名空间中。
- 是否有任何理由将定义的类型包含或不包含到
std
命名空间中?这两个标题有什么不同?
cstdint
没有文件扩展名并使用c
前缀,stdint.h
使用.h
扩展名。
- 此标头的命名约定是什么?
c
前缀表明这是一个 C 库?中缺少文件扩展名是有原因的cstdint
吗?
c - MISRA C 2004 和 c99
MISRA C 2004 的规则 1.1 指定规范涵盖 c90 而不是 c99。
我想使用 stdint 和 stdbool 库而不是自己编写代码。有没有人在他们的 MISRA 实施中做出这个例外?
c++ - 相当于gnu中windows stdint.h中的u_int16_t?
到目前为止,我假设这u_int16_t
是一个名为 stdint.h 的 MSVS 头文件中某处的 Windows 类型。我正在将 GNU g++ 用于编译器(实际上是带有 mingw 的代码块),我想知道typedef unsigned short uint_least16_t;
(在 mingw 的 stdint.h 内部)是否是等价的,或者我能做些什么来包含这种类型?
这个问题实际上与编译用于 MSVS 的google sparsehash项目文件有关,但我使用的是代码块。这是它给我的错误(顺便说一句,错误重复了很多次)。
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\sparsehash\sparsetable|40|error: 'u_int16_t' does not name a type|
继承人的完整日志最多 50 个错误。
c - 如何在一次内存操作中加载可能的最大整数?
我正在构建一个小型字节码 VM,它将在各种平台上运行,包括异国情调的嵌入式和微控制器环境。
我的 VM 中的每个操作码都可以是可变长度的(不超过 4 个字节,不少于 1 个字节)。在解释操作码时,我想为当前操作码创建一个微小的“缓存”。但是,由于它在许多不同的平台上使用,所以很难做到。
因此,这里有一些预期行为的示例:
- 在具有 8 位内存总线的 8 位微控制器上,我希望它只加载 1 个字节,因为它需要多个(慢速)内存操作才能加载,理论上,它可能只需要 1 个字节即可执行当前操作码
- 在 8086(16 位)上,我想加载 2 个字节,因为只加载 1 个字节,我们基本上会扔掉一些有用的数据以供以后读取,但我不想加载超过 2 个字节,因为需要多次操作
- 在 32 位 ARM 处理器上,我想加载 4 个字节,因为否则我们要么抛出可能必须再次读取的数据,要么我们正在执行多个操作
我想说这可以通过假设它unsigned int
足够好来轻松处理,但是在 8 位 AVR 微控制器上,int 定义为 16 位,但内存数据总线宽度仅为 8 位,因此 2 个内存加载操作将是必需的。
无论如何,目前的想法:
usinguint_fast16_t
似乎在大多数平台上都能正常工作(ARM 上 32 位,8086 上 16 位,x86-64 上 64 位)。然而,它显然仍然遗漏了 AVR 和其他 8 位微控制器。
我认为 usinguint_fast8_t
可能会起作用,但它会出现在它被定义为 is 的大多数平台上unsigned char
,这绝对不是最佳的
此外,还必须解决另一个问题:未对齐的内存访问。在 x86 上,这可能不会成为问题(理论上它会执行 2 次内存操作,但它可能会缓存在硬件中),但是在 ARM 上,我知道执行未对齐的 32 位访问可能会花费 3 倍就像单个对齐的 32 位加载一样。如果地址未对齐,我想加载对齐选项并获取尽可能多的数据,但不惜一切代价避免另一次内存操作
有没有办法使用神奇的预处理器包含或类似的方法来做到这一点,还是只需要在为平台编译之前手动定义最佳缓存大小?
c - 从 8 位值转换时如何对 9 位值进行符号扩展?
我正在我的简单 VM 中实现一个相对分支功能。
基本上,我得到了一个 8 位的相对值。然后我将其左移 1 位以使其成为 9 位值。因此,例如,如果您说“分支 +127”,这实际上意味着 127 条指令,因此 IP 将增加 256。
我当前的代码如下所示:
但是,我不相信差异会被检测为小于 0。我对签名到未签名的工作方式感到生疏。除此之外,我不确定在 case 参数是 -1 或 -2 或其他东西的情况下是否会正确地从 IP 中减去差异。
基本上,我想要满足这些“测试”的东西
希望这使它更清楚一点。
无论如何,我将如何便宜地做到这一点?我看到了一个类似问题的“解决方案”,但它涉及分裂。我正在使用慢速嵌入式处理器(假设没有有效的乘法和除法方法),所以这是我想避免的一件大事。
c++ - __u8 和 uint8_t 的区别
uint8_t
有人可以解释类型和之间的区别__u8
吗?
我知道这uint8_t
是在 stdint.h 中定义的,它们在每个 unix 系统上都可用。
如果我使用它们,它可以识别我打算做什么。
现在我偶然发现了__u8
和__u16
类型。对我来说似乎是一样的。
其中一些类型在 linux/types.h 中定义
我没有找到__u8
,但我仍然可以使用它,它的行为类似于 uint8_t。
性能或内存消耗有什么不同吗?
感谢帮助 :)
c++ - C++ 读取 int16_t(G++ 编译器)
我需要从stdint.h在int16_t中存储值。如何从用户终端读取此值?
这个答案的方式(所以,我们有 int32_t、int16_t、uint64_t 等。但是 atoi32、atoi16、atoui64 等在哪里?)在 Ubuntu g++ 编译器上不起作用。
我更喜欢使用标准 C++ 库。就像是:
还是更好地读取标准整数然后转换它?
我不使用 C++11。