0

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

由于不同的微处理器有不同的字长,μC/OS-II 的移植包括一系列类型定义,保证了可移植性。具体来说,μC/OS-II 的代码从不使用 C 的 short、int 和 long 数据类型,因为它们本质上是非便携式。相反,我定义了可移植且直观的整数数据类型,如清单 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- 为什么 short int 和 long 数据类型本质上是不可移植的。

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

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;为什么这样做?!

4

1 回答 1

3

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

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

2- 为什么 short int 和 long 数据类型本质上是不可移植的。

更准确地说:它们与 C 一样可移植,它们的大小不是标准化的,这可能使它们对于需要固定特定大小的许多应用程序无用。

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

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

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

是的,就是这个想法。请注意,C 标准甚至没有规定 char 的大小,尽管我从未听说过除了 8 位之外的任何实现[但评论中有人有]

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

你可以,是的。可能作者想限制定义这种类型的地方的数量。由于使用#define是一个预处理器指令,它还可以稍微简化可执行文件(尽管没有达到普遍认为重要的程度)。

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

同样,typedef 的使用与“糖”有很大关系。它们可以使您的代码更清晰、更易于阅读,并且(假设它们做得正确)更健壮。“布尔”是一个数学派生的 CS 术语,表示只有两个有意义的值,零 (false) 或非零 (true)。所以理论上它可以只用一个位来实现,但这既不容易也不是最终有效的(因为没有具有 1 位寄存器的处理器,它们无论如何都必须切骰子并伪造这样的)。定义“bool”或“boolean”类型在 C 中很常见,用于指示值的重要性是真还是假——它适用于例如if (var)(true) 和if (!var)(false),因为 C 已经以这种方式计算(0 和 NULL 是唯一可以通过的值if (!var))。INT8U表示您正在处理一个范围从十进制 0 到 255 的值,因为它是无符号的。我认为U预先提出是一种更常见的做法(UINT8),但如果您习惯了这些概念,那就相当清楚了。当然 typedef/define 也不难检查。


关于stdint.h

Integer types are the ones with the greatest range of variation, and in fact the ISO C standard does require that an implementation include definitions for various integer types with certain minimum sizes in stdint.h. These have names like int_least8_t. Of course, types with a real fixed size (not just a minimum) are needed for many things, and most common implementations do provide them. The C99 standard dictates that if they are available, they should be accessible via names following the pattern intN_t (signed) and uintN_t (unsigned), where N is the number of bits. The signed types are also specified as two's complement, so one can work with such values in all kinds of highly portable ways.

最后一点,虽然我不熟悉 MicroC,但我一般不会将该文档视为 C 的代表——它旨在用于有点限制和专门的环境(16 位 int,由 typedefs 暗示) , 是不寻常的,因此如果您在其他地方运行该代码,则 INT16U 可能是 32 位等)。我猜 MicroC 只符合 ANSI C,这是最古老和最小的标准;显然它没有 stdint.h。

于 2013-09-22T09:45:03.940 回答