AVR C++ uint32_t 的奇怪行为

5
uint32_t a = 65536;
uint32_t b = 1 << 16;

为什么这里是a != b,但是

uint32_t a = 65536;
uint32_t b = 65536;

这里虽然应该是相同的,但a == b,涉及到IT技术相关内容。

我正在使用CLion作为IDE,并使用CMake 3.7.1与Arduino CMake。


2
我猜这是针对8位或16位微控制器的,我的猜测正确吗? - Marcus Müller
ATMEGA 328P-PU,是8位的。一如既往,我在发布后几秒钟就自己解决了:我需要将1强制转换为uint32_t... - aquaatic
1
可能也可以写成1UL。C语言有后缀可以改变字面量的类型。 - Zan Lynx
1
没关系,我知道你在做什么。我会对正确大小的已声明变量进行显式赋值,但无论如何都可以。强制转换也可以。 - Zan Lynx
请发送一段代码,以便我们查看您的问题。如果您粘贴一段代码(也可以是函数),我们可以更好地理解问题。 - Sir Jo Black
显示剩余3条评论
2个回答

6
uint32_t b = 1 << 16;

正如您所注意到的,如果不先将1转换为32位整数,则此方法会失效:

字面量1是编译器上的默认整数类型。我们不知道该编译器是8位还是16位整型。

现在假设它是16位整型。当您将1左移16次时,这就变得毫无意义了。因此,请先将1转换为32位整数,然后再进行移位操作。


2
int 类型至少需要 16 位。不允许使用 8 位整型。 - Pete Becker
一个好的方法是使用 stdint.h 中的 UINT32_C(1) - ndim

2

我需要将1转换为uint32_t类型,这样才有足够的字节进行移位操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接