我今天尝试了编译器如何确定声明为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.
为什么int
是Int32.MinValue
到Int32.MaxValue
之间的任何数字的默认值?
使用尽可能小的数据类型来节省内存不是更好吗? (我知道现在内存很便宜,但是,节省内存并不是那么糟糕,特别是如果它很容易做到(。
如果编译器确实使用了最小的数据类型,并且您有一个具有 255 的变量,并且知道稍后您希望存储像 300 这样的值,那么程序员可以将其声明为short
而不是使用var
。
为什么var d = 2147483648
隐式uint
而不是long
?
如果可以的话,编译器似乎总是会尝试使用 32 位整数,首先是有符号的,然后是无符号的,然后是long
的。
如果可以的话,编译器似乎总是会尝试使用 32 位整数,首先是有符号的,然后是无符号的,然后是长整的。
这是完全正确的。C# 语言规范解释说,它尝试选择一个整数类型,该类型使用尽可能小的字节数来表示没有后缀的整数文本。以下是语言规范中的解释:
为了允许将尽可能小的
int
和long
值写为十进制整数文本,存在以下两个规则:
- 当值为
2147483648
且没有整数类型后缀的十进制整数文本作为紧跟在一元减运算符标记之后的标记显示时,结果是值为−2147483648
的int
类型的常量。在所有其他情况下,此类十进制整数文本的类型为uint
。- 当值为
9223372036854775808
且没有整数类型后缀或整数类型后缀L
或l
的十进制整数文本作为标记紧跟在一元减运算符标记之后时,结果是值为−9223372036854775808
的long
类型的常量。在所有其他情况下,此类十进制-整数-文本的类型为ulong
。
请注意,语言规范明确提到了您的var d = ...
示例,要求结果的类型为uint
。