c - int_fast8_t 和 int_fast16_t 之间的区别
问题描述
我是嵌入式系统的初学者,我在头文件中看到int_fast8_t/int_fast16_t/int_fast32_t都是有符号的 int。那么它们之间有什么区别吗?还是它们基本相同,即使您为 int_fast8_t 分配了 32 位,它仍然会存储 32 位而不是使其成为 8 位?
/* fastest minimum-width signed integer types */
typedef signed int int_fast8_t;
typedef signed int int_fast16_t;
typedef signed int int_fast32_t;
typedef signed __INT64 int_fast64_t;
解决方案
这就是特定实现定义它们的方式。该标准要求 a至少为int_fast8_t
8位。并且它们的目的是实现应该使用它们中最快的,但对此或如何衡量它没有严格的要求。
1 以下每种类型都指定了一个整数类型,在至少具有指定宽度的所有整数类型中,它通常是最快的(262 )操作。
2 typedef 名称 int_fastN_t 指定最快的有符号整数类型,其宽度至少为 N 。typedef 名称 uint_fastN_t 指定最快的无符号整数类型,其宽度至少为 N 。
3 需要以下类型:
int_fast8_t uint_fast8_t int_fast16_t uint_fast16_t int_fast32_t uint_fast32_t int_fast64_t uint_fast64_t
此表格的所有其他类型都是可选的。
链接的注释说:
- 不保证指定的类型在所有用途中都是最快的;如果实现没有明确的理由选择一种类型而不是另一种,它将简单地选择一些满足符号和宽度要求的整数类型。
通常,“快速”变量被定义为目标处理器的本机大小,前提是它至少与指定大小一样大。请注意,这取决于更快的情况。当您对单个变量进行操作时,通常最好使用本机大小,但在大型数组上,您通常需要满足您需求的最小类型,因为数组越大,原始字节越差用于缓存。
例如,以Open Watcom for DOS 为例。你有这个:
typedef signed int int_fast8_t;
typedef signed int int_fast16_t;
typedef signed long int_fast32_t;
typedef signed long long int_fast64_t;
请注意,这是 32 位和 16 位之间的区别,在您的示例中没有。
在我的 gcc 实现中,我有这个:
typedef unsigned char uint_fast8_t;
typedef unsigned long int uint_fast16_t;
typedef unsigned long int uint_fast32_t;
typedef unsigned long int uint_fast64_t;
AFIK在几乎所有情况下int8_t
都会表现得完全一样。int_fast8_t
但在某些情况下,您可能需要小心。看看这个程序:
#include <stdio.h>
#include <stdint.h>
int main(void) {
int_fast16_t array[] = { 12345,23456,34567 };
int16_t *ptr = array;
for(int i=0; i<3; i++) {
printf("%d %d\n", ptr[i], array[i]);
}
}
它给了我这个警告:
$ gcc main.c
main.c: In function ‘main’:
main.c:6:20: warning: initialization of ‘int16_t *’ {aka ‘short int *’} from incompatible pointer type ‘int_fast16_t *’ {aka ‘long int *’} [-Wincompatible-pointer-types]
6 | int16_t *ptr = array;
| ^~~~~
并打印:
$ ./a.out
12345 12345
0 23456
0 34567
这些类型基本上分为三类:
- 精确宽度
- 最小宽度
- 最快的最小宽度
确切的宽度必须准确,但另外两个有相同的要求,但目的不同。
在嵌入式系统中,我会为数组选择精确的宽度,为常规变量选择最快的(或只是int
或)。long
如果存在确切的宽度,我真的看不出最小宽度有什么用,除了便携性。在这里我想指出标准要求最小和最快,但不要求精确宽度。大多数系统确实支持精确宽度。因此,除非您想要 100% 的可移植性或知道您需要在不支持它的机器上编译代码,否则我总是更喜欢精确宽度而不是最小宽度。
推荐阅读
- c++ - 如何解决 C++ 测试单元中的链接器错误
- math - HLSL 中的高效条件天花板和地板
- python - 将环境变量传递给 docker-compose
- python-pptx - 如何检测 pptx 幻灯片中所有现有的 PNG/JPG 图像,然后使用 python pptx 操作它们的大小/布局?
- javascript - Axios 不会立即更新状态
- azure-active-directory - Azure AD 企业应用程序 - 识别调用者应用程序
- r - 从源代码编译 R 包的多个不同错误
- c# - 通过 ajax 将 XML 属性与 Elements 一起发送到 C# 控制器方法并解析以保存
- python - 如何使用 time.sleep() 绘制圆圈 Tkinter?
- javascript - 更改 JavaScript 函数以删除 HTML 标记,除了