预定义的数值类型
C# type | Systemtype | Suffix | Size | Range |
---|---|---|---|---|
Integral-signed | ||||
sbyte | SByte | 8bits | -27to27-1 | |
short | Int16 | 16bits | .-215to215_-1 | |
int | Int32 | 32bits | -231to231-1 | |
long | Int64 | L | 64bits | -263to263-1 |
Integral—unsigned | ||||
byte | Byte | 8bits | 0to28-1 | |
ushort | UInt16 | 16bits | 0to216-1 | |
uint | UInt32 | U | 32bits | 0to232-1 |
ulong | UInt64 | UL | 64bits | 0to264-1 |
Real | ||||
float | Single | F | 32bits | ±(~10-45to1038) |
double | Double | D | 64bits | ±(~10-324to10308) |
decimal | Decimal | M | 128bits | ±(~10-28to1028) |
数值Litertal
就是字面上写的那些值
int x =127; 127就是数值
整数类型的literal可使用10/16进制符号,16进制是在前边加上0x前缀
long y = 0x7F;
使用下换线
int million = 1_000_000; 注:从C#7开始支持
二进制var b = 0b1010_1011_1100_1101_1110_1111;
实数Literal
使用小数点double d =1.5;
指数形式double million = **1E06**;
数值Litertal的类型推断
- 默认情况下:编译器会推断一一个数值literal是double还是整数类型:
- 如果包含小数点,或以指数形式展现,那么就是double类型
- 否则literal的类型是下面列表里第一个能容纳该数值的类型
- int , uint , longulong
数值的后缀
- U、L很少使用,因为uint、long、ulong要么可以被推断出来,要么可以从int隐式转换过来
- D其实很多余。(因为所有使用小数点的都可以推断成double)
- F、M是比较有用,当指定float或decimal的Literal的时候,应该加上。
类型转换
- 整数类型
- 当目标类型可以容纳源类型的时候,整数转换时隐式的
- int x = 123456;
- long y = x;
- 否则就需要显示转换
- short z =(short)y;
- 当目标类型可以容纳源类型的时候,整数转换时隐式的
- 浮点型
- float可以隐式的转换成double(float比double要小)
- double必须显示的才能转换为float
- 浮点与整数
- 所有的整数类型都可以隐式的转换为所有的浮点类型
- 反过来则必须进行显示转换
- 以上大多是因为精度的问题
注意
- 当从浮点型转为整型时,小数部分是被截断的,没有舍入。
- 把一个很大的整数隐式的转换为浮点类型之后,会保证量级不变,但是偶尔会丢失精度。这是因为浮点类型有更多的量级,而精度可能不足。
int i = 100000001;
float f =i;
int i2 = (int)f;
System.Console.WriteLine(i); //100000001
System.Console.WriteLine(f); //1E+08 (意思是1后面8个0)
System.Console.WriteLine(i2); //100000000
decimal转换
- 所有的整数类型可以被隐式的转换为decimal类型(大小关系)
- 反过来则必须进行显示转换
除了自增其余操作运算符略过
int i = 1;
int b = (i++)+(++i)+2+(++i)+(++i)-(--i);
System.Console.WriteLine(b); // run:11
8,16位整数类型
byte
、sbyte
、short
、ushort
没有自己的算术操作符
C#会按需对它们进行隐式
转换到大一点的整数类型。
NaN = Not a number
使用==时,NaN不等于任何一个值,包括NaN
使用object.Equals()方法时两个NaN是相等的
验证某个值是否为NaNfloat.lsNan()
, double.IsNaN()
class Program
{
static void Main(string[] args)
{
Console.WriteLine(1.0 / 0.0); // Infinity 无穷大
Console.WriteLine(-1.0 / 0.0); // -Infinity
Console.WriteLine(1.0 / -0.0); // -Infinity
Console.WriteLine(-1.0 / -0.0); // Infinity
Console.WriteLine(0.0 / 0.0); // NaN I
Console.WriteLine((1.0 / 0.0) - (1.0 / 0.0)); // NaN
Console.WriteLine((0.0 / 0.0) == double.NaN); // False
Console.WriteLine(object.Equals(0.0 / 0.0, double.NaN)); // True
}
}