我第一次使用嵌入式C进行开发。虽然我的C语言有点生疏,但我能读懂代码,但我不太了解某些行为的原因。例如,我想知道一个变量是否为真或假,并将其传回另一个应用程序。原始实现者选择将变量设置为0xFF,而不是设置为1或0。
他是试图将它设置为地址空间吗?还是其他原因导致布尔变量被设置为255?
0xFF
设置char中的所有位。
最初的实现者可能认为标准的0
和1
不够好,决定如果所有位都是off,则为false,但如果所有位都是on,则为true。
这个方法有效是因为在C语言中,除了0之外的任何值都是true。尽管这将设置char中的所有字节,但对于任何其他变量类型,只要变量中有一个位被设置为1,它就会返回true。
如果你急需内存,你可能想要在一个字节中存储8个布尔值(或在long中存储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。
在嵌入式系统中,通常只有一个程序员编写所有代码,他/她的个人习惯贯穿整个源代码。许多嵌入式程序员是硬件工程师,必须尽力使系统运行良好。没有“可移植性”的要求或概念。另一个考虑因素是嵌入式系统的编译器是特定于CPU硬件的。请参考该CPU的ISA,并检查所有使用“boolean”的情况。
正如其他人所说,它将所有位设置为1。由于这是嵌入式C语言,您可能会将其存储到每个位对某些重要内容都很重要的寄存器中,因此您想将它们全部设置为1。我知道当我使用汇编语言编写时也会做类似的事情。
关于这个问题,真正需要知道的是“var”的类型。你说“boolean”,但它是C++/C99的布尔类型,还是(很可能是一个嵌入式C应用程序),完全不同类型的东西被用作布尔值?
0xff
是0
的二进制补码。在您的嵌入式架构上,将0xff
存储到变量中可能比存储1
更有效,因为后者可能需要额外的指令或存储在内存中的常量。0xff
作为TRUE值,无论检查哪个位...它们都被设置了。
CHAR_BIT != 8
)。 - Alexandre C.