如何在Visual Basic .NET中实现有符号整数的零扩展
问题根因
VB 2010 默认会把不带类型后缀的&H80000000判定为32位有符号整数(Integer类型),这个值恰好是32位有符号整数的最小值,对应数值为-2147483648。当你把它赋值给64位有符号的Long类型变量时,编译器会自动执行有符号扩展,高位全部补1,最终就得到了&HFFFFFFFF80000000的结果。
你尝试用CULng转换报错的原因是,编译器在转换前就已经将&H80000000识别为负的Integer类型,而VB不允许将负整数赋值给无符号类型变量,所以直接触发了编译错误。
解决方法
直接给十六进制常量添加对应的类型后缀,强制编译器按你需要的类型解析即可,两种写法都可以:
- 加
L后缀,强制将常量识别为64位有符号整数(Long类型):
Dim a As Long = &H80000000L
- 加
UL后缀,强制将常量识别为64位无符号整数,再隐式转换为Long类型:
Dim a As Long = &H80000000UL
两种写法最终得到的a的值都是你预期的&H80000000,不会触发符号扩展。
内容的提问来源于stack exchange,提问作者user10328353
相关产品推荐
相关产品推荐

