我是第一次使用嵌入式C语言.虽然我的C是生锈的,但我可以阅读代码,但我并没有真正理解为什么某些行是这样的.例如,我想知道变量是true还是false并将其发送回另一个应用程序.原始实现者不是将变量设置为1或0,而是选择0xFF.
他试图将它设置为地址空间吗?或者为什么将布尔变量设置为255?
0xFF
设置char中的所有位.
最初的实施者可能决定该标准0
并1
不够好,并决定,如果所有的位断是假的,那么所有的位上是真实的.
这是有效的,因为在C中任何0以外的值都是真的.虽然这将设置char中的所有字节,但它也适用于任何其他变量类型,因为在变量中设置的任何一个位都使其成立.
如果你迫切需要内存,你可能想要在一个字节中存储8个布尔值(或者在一个字节中存储32个,或者其他)
这可以通过使用标志掩码轻松完成:
// FLAGMASK = ..1<这仅在booleanFunction()返回0(所有位清零)或-1(所有位设置)时有效.
这是原始问题的答案吗?
3> Cade Roux..:0xFF是〜0的十六进制表示(即11111111)
例如,在VB和Access中,-1用作True.
4> Olof Forshel..:这些年轻人,他们知道什么?
在一种原始的嵌入式语言中 - PL/M(-51是,如8051,-85,-86,-286,-386) - 逻辑运算符之间没有区别(!,&&,||在C中)和按位(〜,&,|,^).相反,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还提供小型,小型,紧凑型,中型和大型型号.