如何在Go中将常量设置为负值

时间:2019-06-11 12:47:46

标签: go constants integer-overflow

我正在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)可以正常工作,但需要我在我移植的许多其他常量中进行此更改?

1 个答案:

答案 0 :(得分:3)

您只需设置它即可

const TRUST_E_NOSIGNATURE = int32(-2146762496)

如果需要,请使用十六进制:

const TRUST_E_NOSIGNATURE = int32(-0x7ff4ff00)

但是,为此,您可能只是使用了错误的数据类型。改用uint32:

const TRUST_E_NOSIGNATURE = uint32(0x800B0100)

  

为什么它不像其他语言那样包装?

因为它不是那样设计的。 Go遵循尽可能明显和直观的哲学。静默包装是非常不直观的。