2 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
您需要將“var sum”設(shè)為“uint16”,否則它永遠(yuǎn)不會(huì)超過(guò) 00FF。

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