var 如何对数字起作用?



我今天尝试了编译器如何确定声明为var的数字的类型。

var a = 255; //Type = int. Value = byte.MaxValue. Why isn't this byte?
var b = 32767; //Type = int. Value = short.MaxValue. Why isn't this short?
var c = 2147483647; //Type = int. Value = int.MaxValue. int as expected.
var d = 2147483648; //Type = uint. Value = int.MaxValue + 1. uint is fine but could have been long?
var e = 4294967296; //Type = long. Value = uint.MaxValue + 1. Type is long as expected.

为什么intInt32.MinValueInt32.MaxValue之间的任何数字的默认值?

使用尽可能小的数据类型来节省内存不是更好吗? (我知道现在内存很便宜,但是,节省内存并不是那么糟糕,特别是如果它很容易做到(。

如果编译器确实使用了最小的数据类型,并且您有一个具有 255 的变量,并且知道稍后您希望存储像 300 这样的值,那么程序员可以将其声明为short而不是使用var

为什么var d = 2147483648隐式uint而不是long

如果可以的话,编译器似乎总是会尝试使用 32 位整数,首先是有符号的,然后是无符号的,然后是long的。

如果可以的话,编译器似乎总是会尝试使用 32 位整数,首先是有符号的,然后是无符号的,然后是长整的。

这是完全正确的。C# 语言规范解释说,它尝试选择一个整数类型,该类型使用尽可能小的字节数来表示没有后缀的整数文本。以下是语言规范中的解释:

为了允许将尽可能小的intlong值写为十进制整数文本,存在以下两个规则:

  • 当值为2147483648且没有整数类型后缀十进制整数文本作为紧跟在一元减运算符标记之后的标记显示时,结果是值为−2147483648int类型的常量。在所有其他情况下,此类十进制整数文本的类型为uint
  • 当值为9223372036854775808且没有整数类型后缀或整数类型后Ll十进制整数文本作为标记紧跟在一元减运算符标记之后时,结果是值为−9223372036854775808long类型的常量。在所有其他情况下,此类十进制-整数-文本的类型为ulong

请注意,语言规范明确提到了您的var d = ...示例,要求结果的类型为uint

相关内容

最新更新