var如何适用于数字?

时间:2018-05-21 10:51:03

标签: c# types integer unsigned-integer

我今天尝试了编译器如何确定声明为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

1 个答案:

答案 0 :(得分:3)

  

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

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

  

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

     
      
  • 当一个带有值2147483648且没有整数类型后缀十进制整数 - 文字出现在紧跟一元减号运算符令牌之后的令牌时,结果是int类型的常量,其值为−2147483648。在所有其他情况下, decimal-integer-literal 的类型为uint
  •   
  • decimal-integer-literal 的值为9223372036854775808且没有整数类型后缀整数类型后缀<时/ em> Ll紧跟在一元减号运算符令牌后面显示为令牌,结果是long类型的常量,其值为−9223372036854775808。在所有其他情况下, decimal-integer-literal 的类型为ulong
  •   

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