我正在用Go编写代码来调用一些Windows信任和加密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)
这工作正常,但需要我在我移植的许多其他常量中进行此更改?
你只需设置它:
const TRUST_E_NOSIGNATURE = int32(-2146762496)
如果您愿意,请使用十六进制:
const TRUST_E_NOSIGNATURE = int32(-0x7ff4ff00)
但为此,您可能只是使用了错误的数据类型。请改用 uint32
:const TRUST_E_NOSIGNATURE = uint32(0x800B0100)
为什么它不像其他语言那样换行?
因为它不是这样设计的。围棋遵循尽可能明显和直观的哲学。静默包装非常不直观。