我第一次使用嵌入式 C。虽然我的 C 语言生锈了,但我可以阅读代码,但我并不真正了解为什么某些行是这样的。例如,我想知道一个变量是真还是假,并将其发送回另一个应用程序。最初的实现者没有将变量设置为 1 或 0,而是选择了 0xFF。
他是否试图将其设置为地址空间?否则为什么将布尔变量设置为 255?
0xFF
设置 char 中的所有位。
最初的实现者可能认为该标准不够好,并认为如果所有位0
都为假,那么所有位都为真。1
这是有效的,因为在 C 中,除 0 之外的任何值都是 true。尽管这会将所有字节设置为 char,但它也适用于任何其他变量类型,因为在变量中设置的任何一位都使其成立。
如果您迫切需要内存,您可能希望将 8 个布尔值存储在一个字节中(或 32 个长字节,或其他)
这可以通过使用标志掩码轻松完成:
// FLAGMASK = ..1<<n for n in 0..7...
FLAGMASK = 0x10; // e.g. n=4
flags &= ~FLAGMASK; // clear bit
flags |= FLAGMASK; // set bit
flags ^= FLAGMASK; // flip bit
flags = (flags & ~FLAGMASK) | (booleanFunction() & FLAGMASK); // clear, then maybe set
这仅在 booleanFunction() 返回 0(所有位清除)或 -1(所有位设置)时有效。
0xFF 是 ~0 的十六进制表示(即 11111111)
例如,在 VB 和 Access 中,-1 用作 True。
这些年轻人,他们懂什么?
在其中一种原始嵌入式语言中 - PL/M(-51 是,如 8051、-85、-86、-286、-386) - 逻辑运算符(C 中的!、&&、||)和按位(~、&、|、^)。相反,PL/M 没有、AND、OR 和 XOR 处理这两个类别。我们最好有两个类别吗?我不确定。不过,我想念 C 中的逻辑 ^^ 运算符(xor)。不过,我想在 C 中构建程序而不涉及逻辑类别是可能的。
在 PL/M 中,False 定义为 0。布尔值通常以字节变量表示。True 被定义为 NOT False,它将为您提供 0ffh(PL/M-ese 用于 C 的 0xff)。
要查看状态标志进位的转换是如何在存储在字节(布尔值不能作为类型)变量之前发生的,PL/M 可以在存储之前使用汇编指令“sbb al,al”。如果设置了进位,al 将包含 0ff,否则将包含 0h。如果需要相反的值,PL/M 将在 sbb 之前插入一个“cmc”或在之后附加一个“not al”(实际上是异或 - 一个或另一个)。
所以 TRUE 的 0xff 是来自 PL/M 的直接兼容端口。必要的?可能不会,除非您不确定自己的技能(在 C 中)并且玩起来超级安全。
就像我会的那样。
PL/M-80(用于 8080、8085 和 Z80)不支持整数或浮点数,我怀疑 PL/M-51 也一样。PL/M-86(用于 8086、8088、80188 和 80186)添加了整数、单精度浮点、segment:offset 指针和标准内存模型小、中、紧凑和大。对于那些如此倾向于创建自己动手的混合内存模型的特殊指令。微软的大内存模型相当于英特尔的大内存。MS 还推出了微型、小型、紧凑型、中型和大型型号。
通常在嵌入式系统中,只有一名程序员编写所有代码,并且他/她的特质贯穿整个源代码。许多嵌入式程序员都是硬件工程师,必须让系统尽可能地运行。没有“可移植性”的要求或概念。嵌入式系统的另一个考虑因素是编译器特定于 CPU 硬件。请参阅此 CPU 的 ISA 并检查“布尔值”的所有用法。
正如其他人所说,它将所有位设置为 1。由于这是嵌入式 C,您可能会将其存储到一个寄存器中,其中每个位对某些东西都很重要,因此您想将它们全部设置为 1。我知道我做到了用汇编程序编写时类似。
了解这个问题真正重要的是“var”的类型。您说“布尔值”,但它是 C++/C99 的布尔值,还是(很可能是嵌入式 C 应用程序),是被用作布尔值的完全不同类型的东西?
还将 1 添加到 0xff 将其设置为 0(假设为 unsigned char),并且检查可能处于循环中,并且增量要中断。
这里有一个可能的原因:0xff
是0
. 可能在您的嵌入式架构上,存储0xff
到变量中比存储更有效,例如,1
这可能需要额外的指令或存储在内存中的常量。
或者,检查架构中寄存器“真值”的最有效方法可能是使用“检查位设置”指令。使用TRUE 值,检查哪个0xff
位都没有关系……它们都已设置。
当然,以上只是推测,不知道您使用的是哪种嵌入式处理器。8 位、16 位、32 位?PIC、AVR、ARM、x86???
(正如其他人指出的那样,对于 C 中的布尔表达式,除零之外的任何整数值都被视为 TRUE。)