2017-08-06 43 views
4
uint32_t a = 65536; 
uint32_t b = 1 << 16; 

为什么a != b这里,但AVR C++ uint32_t的怪异的行为

uint32_t a = 65536; 
uint32_t b = 65536; 

这里a == b虽然它应该在技术上是一样的吗?

我使用CLion作为IDE和CMake 3.7.1与Arduino CMake。

+2

我认为这是针对8位或16位微控制器吗? –

+0

ATMEGA 328P-PU,因此是8位。和往常一样,我在发帖后自己想了一下:我需要将1投给uint32_t ... – aquaatic

+1

也可能也可以将它写为'1UL'。 C有改变文字类型的后缀。 –

回答

5
uint32_t b = 1 << 16; 

,你注意到了,这打破了,如果你不投1至32位整数优先:

文字1是编译器上的默认整数类型。不知道是哪一个,但它是8位或16位整数。

现在,假设它是一个16位英寸当您将1个左移16次时,您只是......好吧,这没有意义。所以,先让你的1为32位整数,然后转换。

+2

“int”必须至少为16位。没有8位进入允许。 –

+0

是的,它是16位(1 << 15正常工作)。 – aquaatic

+0

一个好的方法是使用'stdint.h'中的'UINT32_C(1)'。 – ndim

2

我不得不投1至uint32_t的,所以有足够的字节来接班。