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

use*_*697 5 .net c# vb.net hex

在C#中:

0x80000000==2147483648 //outputs True
Run Code Online (Sandbox Code Playgroud)

在VB.NET中:

&H80000000=2147483648 'outputs False
Run Code Online (Sandbox Code Playgroud)

这怎么可能?

Han*_*ant 9

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

C#始终支持无符号整数.您使用的值对于int来说太大,因此编译器会选择可以正确表示值的下一个类型.这对两者都是不利的.

在版本8(.NET 2.0)之前,VB.NET没有获得无符号整数支持.传统上,编译器被迫选择Long作为2147483648文字的类型.然而,规则对于十六进制文字是不同的,它传统上支持指定负值的位模式(参见语言规范中的第2.4.2节).所以&H80000000是Integer类型的文字,值为-2147483648,而2147483648是Long.因此不匹配.

如果您认为VB.NET是一种古怪的语言,那么我邀请您阅读这篇文章 :)


Dav*_*jas 5

VB版应该是:

&H80000000L=2147483648
Run Code Online (Sandbox Code Playgroud)

如果没有'long'说明符('L'),VB将尝试将&H8000000解释为整数.如果你强迫它将其视为long类型,那么你将获得相同的结果.&H80000000UI也可以工作 - 实际上这是C#将文字视为的类型(UInt32).