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

这怎么可能?

0x80000000==2147483648在C#中,但在VB.NET中没有

这与语言背后的历史有关。

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

UInt32Int32都取32位,但由于Int32是有符号的,所以第一位被认为是指示数字是否为负数的符号:0表示正数,1表示负数。要将负二进制数转换为十进制数,请执行以下操作:

  1. 反转位。你得到01111111111111111111111111111111
  2. 将其转换为十进制。你得到2147483647
  3. 这个数字加1。你得到2147483648
  4. 把这个否定。您得到的-2147483648等于VB.NET中的&H80000000