代码之家  ›  专栏  ›  技术社区  ›  Dan

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

  •  19
  • Dan  · 技术社区  · 16 年前

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

    他想把它设置到地址空间吗?或者,为什么要将布尔变量设置为255?

    9 回复  |  直到 10 年前
        1
  •  31
  •   Stan    10 年前

    0xFF 设置字符中的所有位。

    最初的实施者可能认为 0 1 不够好,决定 远离的 然后所有比特 .

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

        2
  •  12
  •   mfx    16 年前

    如果您急需内存,您可能希望将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(所有位设置)时有效。

        3
  •  9
  •   Cade Roux    16 年前

    0xff是~0的十六进制表示(即11111111)

    例如,在vb和access中,-1用作true。

        4
  •  9
  •   Olof Forshell    12 年前

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

    在一种原始的嵌入式语言-pl/m中(与8051、-85、-86、-286、-386中一样是-51),逻辑运算符之间没有区别(!,&&,in c)和位(~,&,,^)。相反,PL/M没有、和、或和XOR处理这两个类别。我们在两种情况下会过得更好吗?我不太确定。不过,我错过了C中的逻辑^^运算符(XOR)。不过,我想在不涉及逻辑范畴的情况下,用C语言构建程序是可能的。

    在pl/m中,false定义为0。布尔值通常用字节变量表示。“真”定义为“非假”,它将给您0ffh(pl/m-ese表示c的0xff)。

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

    因此,0xFF for true是来自pl/m的直接兼容端口。有必要吗?可能不会,除非你不确定你的技能(在C)和发挥它超级安全。

    就像我想的那样。

    pl/m-80(用于8080、8085和Z80)不支持整型或浮点型,我怀疑pl/m-51也是一样的。pl/m-86(用于8086、8088、80188和80186)加整数、单精度浮点、分段:偏移指针和标准内存模型小、中、紧凑和大。对于那些如此倾向的人,有专门的指令来创建自己动手的混合记忆模型。微软的大内存模型相当于英特尔的大内存模型。微软还推出了小型、小型、紧凑型、中型和大型车型。

        5
  •  4
  •   humble_guru    16 年前

    通常在嵌入式系统中,有一个程序员编写所有代码,他/她的特性贯穿整个源代码。许多嵌入式程序员都是硬件工程师,必须让系统尽可能地运行。“可移植性”既没有要求也没有概念。嵌入式系统中的另一个考虑因素是编译器是针对CPU硬件的。请参阅此CPU的ISA并检查“布尔”的所有使用。

        6
  •  3
  •   Paul Tomblin    16 年前

    正如其他人所说,它将所有位设置为1。由于这是嵌入的C,所以您可能将它存储到一个寄存器中,其中的每一位对于某个事物都很重要,所以您希望将它们全部设置为1。我知道我用汇编语言写作时也做过类似的事情。

        7
  •  3
  •   XPav    16 年前

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

        8
  •  2
  •   Vaibhav Garg    16 年前

    另外,将1添加到0xFF会将其设置为0(假定为无符号字符),并且检查可能位于一个循环中,其增量为break。

        9
  •  1
  •   Dan Lenski    16 年前

    可能的原因如下: 0xff 是的二进制补码 0 . 可能是在你的嵌入式架构中,存储 0xFF 变为变量比存储更有效,比如, 1 这可能需要额外的指令或存储在内存中的常量。

    或者,检查体系结构中寄存器的“真值”最有效的方法是使用“检查位集”指令。用 0xFF 作为真正的价值,这并不重要 哪一个 位被检查…他们都准备好了。

    当然,上面只是猜测,不知道您使用的是哪种嵌入式处理器。8位,16位,32位?pic,avr,arm,x86????

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