首页 > 解决方案 > 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.

为什么介于和int之间的任何数字都是默认值?Int32.MinValueInt32.MaxValue

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

如果编译器确实使用了最小的数据类型,并且如果你有一个 255 的变量并且知道稍后你会想要存储一个像 300 这样的值,那么程序员可以只声明它short而不是使用var.

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

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

标签: c#typesintegerunsigned-integer

解决方案


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

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

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

  • 当带有 value且没有integer-type-suffix的decimal-integer-literal出现为紧跟一元减号运算符标记之后的标记时,结果是具有 value的类型的常量。在所有其他情况下,这种十进制整数文字的类型为.2147483648int−2147483648uint
  • 当具有 value且没有integer-type-suffixinteger-type-suffixdecimal-integer-literal出现为紧跟一元减号运算符标记之后的标记时,结果是具有 value的类型常量。在所有其他情况下,这种十进制整数文字的类型为.9223372036854775808 Lllong−9223372036854775808ulong

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


推荐阅读