![]() |
1
31
最初的实施者可能认为
这是因为在C中,除0以外的任何值都是真的。 尽管这将设置一个字符中的所有字节,但它也适用于任何其他变量类型,因为在变量中设置的任何一个位都会使它成为真的。 |
![]() |
2
12
如果您急需内存,您可能希望将8个布尔值存储在一个字节中(或32个长字节,或其他任何字节)。 这可以很容易地通过使用标志掩码来实现:
这仅在booleanfunction()返回0(所有位清除)或-1(所有位设置)时有效。 |
![]() |
3
9
0xff是~0的十六进制表示(即11111111) 例如,在vb和access中,-1用作true。 |
![]() |
4
9
这些年轻人,他们知道什么? 在一种原始的嵌入式语言-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
通常在嵌入式系统中,有一个程序员编写所有代码,他/她的特性贯穿整个源代码。许多嵌入式程序员都是硬件工程师,必须让系统尽可能地运行。“可移植性”既没有要求也没有概念。嵌入式系统中的另一个考虑因素是编译器是针对CPU硬件的。请参阅此CPU的ISA并检查“布尔”的所有使用。 |
![]() |
6
3
正如其他人所说,它将所有位设置为1。由于这是嵌入的C,所以您可能将它存储到一个寄存器中,其中的每一位对于某个事物都很重要,所以您希望将它们全部设置为1。我知道我用汇编语言写作时也做过类似的事情。 |
![]() |
7
3
了解这个问题真正重要的是“var”的类型。你说“布尔”,但它是一个C++/C99的BoOL,还是它(很有可能是一个嵌入式C应用程序),是一个完全不同的类型,它被用作一个布尔? |
![]() |
8
2
另外,将1添加到0xFF会将其设置为0(假定为无符号字符),并且检查可能位于一个循环中,其增量为break。 |
![]() |
9
1
可能的原因如下:
或者,检查体系结构中寄存器的“真值”最有效的方法是使用“检查位集”指令。用
当然,上面只是猜测,不知道您使用的是哪种嵌入式处理器。8位,16位,32位?pic,avr,arm,x86???? (正如其他人所指出的,对于C中的布尔表达式,除零以外的任何整数值都被视为真。) |
![]() |
Community wiki · C中有哪些耗时的操作? 1 年前 |
![]() |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
![]() |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
![]() |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |