嵌入式C:var = 0xFF是什么;做?

时间:2008-10-13 14:06:16

标签: c embedded

我第一次使用嵌入式C语言。虽然我的C是生锈的,但我可以阅读代码,但我并没有真正理解为什么某些行是这样的。例如,我想知道变量是true还是false并将其发送回另一个应用程序。原始实现者不是将变量设置为1或0,而是选择0xFF。

他是否试图将其设置为地址空间?或者为什么将布尔变量设置为255?

9 个答案:

答案 0 :(得分:31)

0xFF设置char中的所有位。

原始实施者可能认为标准01不够好,并决定如果所有位关闭 false 那么 on 上的所有位

这是有效的,因为在C中除0以外的任何值都是真的。 虽然这会在char中设置所有字节,但它也适用于任何其他变量类型,因为在变量中设置的任何一位都使其成立。

答案 1 :(得分:12)

如果你迫切需要记忆,你可能想要在一个字节中存储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(所有位设置)时有效。

答案 2 :(得分:9)

0xFF是〜0的十六进制表示(即11111111)

例如,在VB和Access中,-1用作True。

答案 3 :(得分:9)

这些年轻人,他们知道什么?

在一种原始嵌入式语言中 - PL / M(-51是8051,-85,-86,-286,-386) - 逻辑运算符之间没有区别(!,&amp;&amp;, ||在C)和按位(〜,&amp;,|,^)。相反,PL / M有NOT,AND,OR和XOR处理这两个类别。我们最好有两个类别吗?我不确定。但我错过了C中的逻辑^^运算符(xor)。不过,我想我可以在C中构建程序,而不必涉及逻辑类别。

在PL / M中,False定义为0.布尔值通常用字节变量表示。 True被定义为NOT False,它将为你提供0ffh(对于C的0xff,PL / M-ese)。

为了了解状态标志进位的转换如何在一个字节中存储(布尔值不可用作类型)变量,PL / M可以在存储之前使用汇编指令“sbb al,al”。如果设置了进位,则al将包含0ff,如果不是,则包含0h。如果需要相反的值,PL / M将在sbb之前插入“cmc”或在之后附加“not al”(实际上是xor - one或其他)。

因此,TRUE的0xff是PL / M的直接兼容端口。必要?可能不会,除非你不确定自己的技能(在C中)并且玩得非常安全。

就像我一样。

PL / M-80(用于8080,8085和Z80)不支持整数或浮点数,我怀疑它对于PL / M-51是相同的。 PL / M-86(用于8086,8088,80188和80186)增加了整数,单精度浮点,段:偏移指针和标准内存模型小,中,紧凑和大。对于那些如此倾向的人来说,有一些特殊的指令来创建自己动手的混合记忆模型。微软巨大的内存模型相当于英特尔的大型内存。 MS还提供小型,小型,紧凑型,中型和大型型号。

答案 4 :(得分:4)

通常在嵌入式系统中,有一个程序员编写所有代码,他/她的特性遍布整个源代码。许多嵌入式程序员都是硬件工程师,他们必须尽可能地运行系统。没有要求也没有“便携性”的概念。嵌入式系统中的另一个考虑因素是编译器特定于CPU HW。请参阅此CPU的ISA并检查“boolean”的所有用法。

答案 5 :(得分:3)

正如其他人所说,它将所有位设置为1.由于这是嵌入式C,您可能会将其存储到寄存器中,其中每个位对于某些内容都很重要,因此您希望将它们全部设置为1。知道我在汇编语言写作时做的很相似。

答案 6 :(得分:3)

了解这个问题真正重要的是“var”的类型。你说“boolean”,但它是C ++ / C99的bool,还是它(很可能是一个嵌入式C应用程序),一种完全不同的类型被用作布尔值?

答案 7 :(得分:2)

同样将1添加到0xff会将其设置为0(假设为无符号字符),并且检查可能已经在一个循环中并且有一个递增的中断。

答案 8 :(得分:1)

以下是可能的原因:0xff0的二进制补码。可能在嵌入式体系结构中,将0xff存储到变量中比存储1更有效,这可能需要额外的指令或存储在内存中的常量。

也许检查架构中寄存器“真值”的最有效方法是使用“检查位设置”指令。如果0xff为TRUE值,哪个位被检查无关紧要......它们都已设置。

以上只是猜测,当然,不知道你正在使用什么样的嵌入式处理器。 8位,16位,32位? PIC,AVR,ARM,x86 ???

(正如其他人所指出的那样,对于C中的布尔表达式,除0以外的任何整数值都被视为TRUE。)