我正在Go中编写代码以调用某些Windows信任和crypt dll来验证文件签名。我试图在逐字逐句移植的wincrypt.h中有很多常量,但是我遇到了整数溢出的问题。
例如,可以从WinVerifyTrust返回的所有错误代码均为负值。如果我举一个例子 TRUST_E_NOSIGNATURE ,则在winerror.h中将其定义为:#define TRUST_E_NOSIGNATURE _HRESULT_TYPEDEF_(0x800B0100L)
。在我的Go代码中,我有const TRUST_E_NOSIGNATURE = int32(0x800B0100)
,但是在编译时错误是:
常数2148204800溢出int32
当我真的期望该值为-2146762496
所以,我的问题 1)为什么它不像其他语言那样包装 2)是否仍然需要让常量仍然使用十六进制表示形式数字,还是我必须将代码更改为const TRUST_E_NOSIGNATURE = int32(-2146762496)
可以正常工作,但需要我在我移植的许多其他常量中进行此更改?
答案 0 :(得分:3)
您只需设置它即可
const TRUST_E_NOSIGNATURE = int32(-2146762496)
如果需要,请使用十六进制:
const TRUST_E_NOSIGNATURE = int32(-0x7ff4ff00)
但是,为此,您可能只是使用了错误的数据类型。改用uint32:
const TRUST_E_NOSIGNATURE = uint32(0x800B0100)
为什么它不像其他语言那样包装?
因为它不是那样设计的。 Go遵循尽可能明显和直观的哲学。静默包装是非常不直观的。