我今天尝试了编译器如何确定声明为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
。
答案 0 :(得分:3)
似乎编译器总是会尝试使用32位整数,如果它可以,首先签名,然后是无符号,然后是长。
这是完全正确的。 C#语言规范解释说它试图选择一个整数类型,它使用尽可能少的字节数来表示没有后缀的整数文字。以下是语言规范的解释:
为了允许将尽可能小的
int
和long
值写为十进制整数文字,存在以下两个规则:
- 当一个带有值
2147483648
且没有整数类型后缀的十进制整数 - 文字出现在紧跟一元减号运算符令牌之后的令牌时,结果是int
类型的常量,其值为−2147483648
。在所有其他情况下, decimal-integer-literal 的类型为uint
。- 当 decimal-integer-literal 的值为
9223372036854775808
且没有整数类型后缀或整数类型后缀<时/ em>L
或l
紧跟在一元减号运算符令牌后面显示为令牌,结果是long
类型的常量,其值为−9223372036854775808
。在所有其他情况下, decimal-integer-literal 的类型为ulong
。
请注意,语言规范明确提到了您的var d = ...
示例,要求结果为uint
类型。