0x80000000==2147483648在C#中,但在VB.NET中没有
本文关键字:VB NET 但在 0x80000000 2147483648 | 更新日期: 2023-09-27 18:05:09
在C#中:
0x80000000==2147483648 //outputs True
在VB.NET中:
&H80000000=2147483648 'outputs False
这怎么可能?
这与语言背后的历史有关。
C#始终支持无符号整数。您使用的值对于int来说太大,因此编译器会选择下一个可以正确表示该值的类型。这是两者的uint。
VB。NET直到版本8(.NET 2.0(才获得无符号整数支持。因此,传统上,编译器被迫选择Long作为2147483648文本的类型。然而,十六进制文字的规则不同,它传统上支持指定负值的位模式(请参阅语言规范中的2.4.2节(。所以&H80000000是Integer类型的文字,值为-2147483648,2147483648是Long。因此不匹配。
如果你认为VB.NET是一种奇特的语言,那么我邀请你阅读这篇文章:(
VB版本应该是:
&H80000000L=2147483648
如果没有"long"说明符("L"(,VB将尝试解释&H8000000为整数。如果你强迫它将其视为一个长类型,那么你会得到同样的结果。&H80000000UI也会起作用——实际上这是C#将文本视为的类型(UInt32(。
这是因为十六进制数的类型在C#中为UInt32
,在VB.NET中为Int32
。
十六进制数的二进制表示为:
10000000000000000000000000000000
UInt32
和Int32
都取32位,但由于Int32
是有符号的,所以第一位被认为是指示数字是否为负数的符号:0
表示正数,1
表示负数。要将负二进制数转换为十进制数,请执行以下操作:
- 反转位。你得到
01111111111111111111111111111111
- 将其转换为十进制。你得到
2147483647
- 这个数字加1。你得到
2147483648
- 把这个否定。您得到的
-2147483648
等于VB.NET中的&H80000000