如何使我的数据类型独立于 c 中的编译器



我正在研究uC/OS并阅读了这篇文章:

由于不同的微处理器具有不同的字长,因此端口 的 μC/OS-II 包括一系列类型定义,可确保 具体来说,μC/OS-II 的代码从不使用 C 短数据类型、整数数据类型和长数据类型,因为它们本质上是 非便携式。相反,我定义了两者兼而有之的整数数据类型 便携且直观,如清单 1.1 所示。另外,为了方便起见, 我已经包含了浮点数据类型,即使μC/OS-II没有 利用浮点。下面是清单 1.1

typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned int INT16U;
typedef signed int INT16S;
typedef unsigned long INT32U;
typedef signed long INT32S;
typedef float FP32;
typedef double FP64;
#define BYTE INT8S
#define UBYTE INT8U
#define WORD INT16S
#define UWORD INT16U
#define LONG INT32S
#define ULONG INT32U

我的问题是:

1-作者所说的字长(我的问题正文中的第一个粗体字)是什么意思?!

2-为什么短整型和长整型数据类型本质上是不可移植的。

3-typedef是微处理器指令,如果是,它的功能是什么?!

4-我可以写typedef unsigned char (anything)而不是typedef unsigned char INT8U;

5-为什么作者代码typedef unsigned char INT8U;然后#define UBYTE INT8U 我不能直接使用它typedef unsigned char UBYTE;

6-有双重用途typedef unsigned char其中一个是typedef unsigned char INT8U;,另一个是typedef unsigned char BOOLEAN;他为什么要这样做?!

1-作者所说的字长是什么意思

单词是记忆的基本单位,就像页面一样 - 实际上,也有一篇关于单词的文章,我不会反刍。 正如您的作者所说,对 C 的重要性在于它并不总是相同的,而是由硬件特性决定的。 这可能是 C 标准不规定基本类型的文字大小的原因之一;要考虑的最明显的是指针的大小,在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节,以反映地址空间的大小。

2-为什么短整型和长整型数据类型本质上是不可移植的。

更准确地说:它们与C一样便携,但它们的大小没有标准化这可能使它们在许多需要固定特定尺寸的应用程序中毫无用处。

3-typedef是微处理器指令,如果是它的功能是什么?!

不,它不是处理器指令。 这是一个很好的语法糖,使您能够定义自定义类型。

4-我可以写typedef无符号字符

(任何东西)而不是typedef无符号字符INT8U吗?

是的,就是这个想法。 请注意,C 标准甚至没有规定字符的大小,尽管我从未听说过它不是 8 位的实现 [但评论中的某人有]。

5-为什么作者代码类型定义无符号字符INT8U; 然后 #define UBYTE INT8U 我不能直接使用这个 typedef 无符号字符 UBYTE;

你可以,是的。 可能作者想限制定义此类类型的位置数量。 由于使用 #define 是预处理器指令,因此它也可能稍微简化可执行文件(尽管没有达到通常重要的程度)。

6-有双重用途的typedef无符号字符,

其中一个是typedef无符号字符INT8U; 和另一个类型定义无符号字符布尔值;他为什么要这样做?!

同样,typedefs的使用与"糖"有关;它们可以使您的代码更清晰,更易于阅读,并且(假设它们正确完成)更健壮。 "布尔值"是一个数学派生的 CS 术语,用于表示只有两个有意义的值的类型,零(假)或不零(真)。 因此,理论上只需一位即可实现,但这既不容易,最终也不高效(因为没有具有 1 位寄存器的处理器,他们无论如何都必须切骰子并伪造)。 定义"bool"或"boolean"类型在C中很常见,用于指示值的显著性是真或假 - 它适用于,例如 if (var)(真)和if (!var)(假),因为 C 已经以这种方式计算(0 和 NULL 是唯一会传递 if (!var) 的值)。 而使用 INT8U 之类的东西表示您正在处理的范围从十进制 0 到 255 的值,因为它是无符号的。 我认为把U放在前面是一种更常见的做法(UINT8),但如果你习惯了这些概念,那就相当清楚了。 当然,typedef/define 并不难检查。

<小时 />

关于stdint.h

整数类型是变化范围最大的类型,实际上ISO C标准确实要求实现包括具有某些最小大小的各种整数类型的定义stdint.h。 这些都有类似 int_least8_t .当然,许多事情都需要具有真正固定大小(不仅仅是最小大小)的类型,并且大多数常见的实现确实提供了它们。 C99 标准规定,如果它们可用,则应通过遵循模式的名称访问它们 intN_t (有符号)和 uintN_t(无符号),其中N位数。 有符号类型也被指定为 two 的补码,因此可以以各种高度可移植的方式处理这些值。

最后一点,虽然我不熟悉 MicroC,但我不会将该文档视为 C 的代表 - 它旨在用于某种限制性和专用环境(typedefs 暗示的 16 位 int 是不寻常的,所以如果你在其他地方运行该代码,INT16U 可能是 32 位, 等)。 我猜MicroC只符合ANSI C,这是最古老和最起码的标准;显然它没有标准。

相关内容

  • 没有找到相关文章

最新更新