c# - 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.MinValue
Int32.MaxValue
使用尽可能小的数据类型来节省内存不是更好吗?(我知道现在内存很便宜,但是,节省内存并不是那么糟糕,特别是如果它很容易做到的话)。
如果编译器确实使用了最小的数据类型,并且如果你有一个 255 的变量并且知道稍后你会想要存储一个像 300 这样的值,那么程序员可以只声明它short
而不是使用var
.
为什么是var d = 2147483648
隐式uint
而不是long
?
似乎编译器总是会尝试使用 32 位整数,如果可以的话,首先是有符号的,然后是无符号的,然后是long
.
解决方案
似乎编译器总是会尝试使用 32 位整数,如果可以的话,首先是有符号的,然后是无符号的,然后是长整数。
这是完全正确的。C# 语言规范解释说它试图选择一个整数类型,该类型使用尽可能少的字节数来表示没有后缀的整数文字。以下是语言规范的解释:
为了允许将可能的最小值
int
和long
值写入十进制整数文字,存在以下两条规则:
- 当带有 value且没有integer-type-suffix的decimal-integer-literal出现为紧跟一元减号运算符标记之后的标记时,结果是具有 value的类型的常量。在所有其他情况下,这种十进制整数文字的类型为.
2147483648
int
−2147483648
uint
- 当具有 value且没有integer-type-suffix或integer-type-suffix的decimal-integer-literal出现为紧跟一元减号运算符标记之后的标记时,结果是具有 value的类型常量。在所有其他情况下,这种十进制整数文字的类型为.
9223372036854775808
L
l
long
−9223372036854775808
ulong
请注意,语言规范明确提到了您的var d = ...
示例,要求结果为 type uint
。
推荐阅读
- android - Android 8.1 运行 CTS 显示“INSTALL_FAILED_NO_MATCHING_ABIS:无法提取本机库,res=-113”
- javascript - 在 webapp(服务工作者)中跟踪后台位置
- reactjs - 包含标签的 reactjs 组件加载了错误的 url
- google-chrome - 如何通过谷歌浏览器中的 https://search-7.com/ 等网站避免搜索结果
- java - 如何在 Android 中取消 AsyncTask
- sql - 如何在 IN() Postgres 中用逗号放置多个值
- regex - Grep 正则表达式不完全匹配无效的十六进制颜色代码
- javascript - Mapbox Draw(自定义模式) - 为什么在 draw 时 changeMode() 未定义?
- python - Python 和 FPDF 电子邮件附件 FPDF 错误:不是 PNG 文件
- javascript - 如何使用 jQuery 将多个选择框值和文本放在一起?