按位和无符号long与0xffffffff
以下是switch语句的一些代码。 getvalue()
返回unsigned long
。 有人可以解释为什么value
与0xffffffff
按位联系。 该单元是32位。按位和无符号long与0xffffffff
#define WriteMemory(A,V) *(volatile unsigned long*)(A)=(V) static unsigned value;
case 'b':
value = getvalue();
value &= 0xffffffff;
WriteMemory(2147455555, value);
break;
回答:
unsigned long
不能保证是C标准的32位。它只能保证能够保存32位值。
和0xffffffff
确保32位上的任何位都被清零。
回答:
代码用来有时也被称为“天真/马虎打字”,这意味着它将使用标准C的基本int
和long
类型这些类型是有问题的,往往不可移植的,因为他们有实现定义大小。
由于实现定义的大小,它们在学习上掩饰掉了低32位,如果int
由于某种原因会在某些外来系统上变为64位。
但是,专业程序总是使用stdint.h
的已知大小和签名类型。专业嵌入式系统尤其如此。
相同的代码可以在更安全,更便携的方式被改写为:
#include <stdint.h> #define WriteMemory(A,V) (*(volatile uint32_t*)(A)=(V))
static uint32_t value;
case 'b':
value = getvalue();
WriteMemory(2147455555, value);
break;
uint32_t
解决所有问题:不再有任何怀疑的各类有多大,所以这将是完全多余的面膜低32位。鉴于这是一个32位系统,您也不必担心隐式类型的促销活动。
(请注意,在宏观额外的括号,这是必须避免的经典宏运算符优先级的错误,如x = WriteMemory(2147455555, value) + y;
错误:写value+y
这很可能不是预期的。)
另一个更大的关注这里虽然是如果给定的系统将允许在地址2147455555处发生未对齐的32位写入。看起来非常可疑。
以上是 按位和无符号long与0xffffffff 的全部内容, 来源链接: utcz.com/qa/267016.html