2017-08-06 74 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的,所以有足夠的字節來接班。