2016-03-29 38 views

回答

1

在無符號整數類型的情況下,最低的適當位數存儲在變量中。 (Brian的答案涵蓋了我在此說的所有內容。)

例如,unsigned char a = 257將導致a=1

編譯器(在這種情況下爲gcc)會在您執行此類分配時發出警告,例如, filename.c:line:column: warning: overflow in implicit constant conversion [-Woverflow]

3

根據[conv.integral]

如果目標類型是無符號,所得到的值是一致的源 整數(模2^n的至少無符號整數,其中n是比特數用於表示無符號類型)。 [注:在兩個 補碼錶示中,此轉換是概念性的,並且位模式沒有變化(如果 沒有截斷)。 - 注完]

如果目標類型有符號,則該值是不變的,如果它可以在目標類型(和 位字段寬度)來表示;否則,該值是實現定義的。

因此,對於您的示例,您可以可靠地得到零;如果您使用int8_t而不是uint8_t,則結果將由實施定義。 (相反,如果對有符號整型操作溢出,結果是不確定的行爲。爲什麼不一致?我不知道。)

+0

至於「爲什麼?」請參閱:http://stackoverflow.com/questions/18195715/why-is-unsigned-integer-overflow-defined-behavior-but-signed-integer-overflow-is – NathanOliver

3

我會盡力理解它與你一起。

uint8_t是一個8位數據類型或一個字節。它有8個插槽,可以是101111 1111將是255.所以,如果你有一個它,它繼續繼續。 255 + 1的二進制值將爲1 0000 0000,但由於數據類型只能存儲8位,因此會丟棄1,並且變爲0000 0000,這將轉換爲整數值0

至少,這就是我理解它的工作原理。

相關問題