2 回答
TA貢獻1858條經(jīng)驗 獲得超8個贊
在您的 C 代碼中,的類型sum是,它是大小為1int的至少 16 位的有符號整數(shù)類型。
然而,你的 Go 代碼中的類型sum是一個限制為 8 位的無符號整數(shù)類型。uint8
根據(jù)您的 format string 判斷%04X},您可能需要一個 16 位值。
要修復 Go 代碼,只需更改uint8并int使用sum += int(msg[i])以使編譯器滿意。如果要sum嚴格保留 16 位的值,可以改用uint16and sum += uint16(msg[i])。
如果您想知道為什么需要包裝msg[i],uint16(...)那是因為您要將值轉(zhuǎn)換為不同的類型。C 具有“整數(shù)提升”規(guī)則,可自動將寬度小于的值轉(zhuǎn)換int為類型的值int。然而,Go 沒有這樣的規(guī)則,只是拒絕編譯,聲明類型不兼容。
順便說一句,由于它的自動內(nèi)存管理,你可以簡單地在你的 Go 代碼中這樣做:
req := msg + fmt.Sprintf("%04X}", sum)
fmt.Println(req)甚至:
s := fmt.Sprintf("%04X}", sum)
fmt.Println(msg + sum)您當前的方法沒有問題;這只是額外的冗長。
1 int要求在 C 中至少是 16 位,在 Go 中至少是 32 位,但現(xiàn)在這兩種語言通常都是 32 位。但是,您應該知道,它在某些當前系統(tǒng)上可能是 64 位的,并且在將來的某個時候?qū)τ谌魏我环N語言都可能默認為 64 位;他們不需要保持數(shù)據(jù)類型大小同步。添加值時應牢記這一點,msg以確保 的值為sum16 位(或僅使用uint16)。
- 2 回答
- 0 關(guān)注
- 162 瀏覽
添加回答
舉報
