预定义的数值类型

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
  • 浮点与整数
    • 所有的整数类型都可以隐式的转换为所有的浮点类型
    • 反过来则必须进行显示转换
      • 以上大多是因为精度的问题
  • 注意

    • 当从浮点型转为整型时,小数部分是被截断的,没有舍入
    • 把一个很大的整数隐式的转换为浮点类型之后,会保证量级不变,但是偶尔会丢失精度。这是因为浮点类型有更多的量级,而精度可能不足。
      1. int i = 100000001;
      2. float f =i;
      3. int i2 = (int)f;
      4. System.Console.WriteLine(i); //100000001
      5. System.Console.WriteLine(f); //1E+08 (意思是1后面8个0)
      6. System.Console.WriteLine(i2); //100000000
  • decimal转换

    • 所有的整数类型可以被隐式的转换为decimal类型(大小关系)
    • 反过来则必须进行显示转换

除了自增其余操作运算符略过

  1. int i = 1;
  2. int b = (i++)+(++i)+2+(++i)+(++i)-(--i);
  3. System.Console.WriteLine(b); // run:11

8,16位整数类型

byte
sbyteshort
ushort
没有自己的算术操作符
C#会按需对它们进行隐式
转换到大一点的整数类型。

NaN = Not a number

使用==时,NaN不等于任何一个值,包括NaN
使用object.Equals()方法时两个NaN是相等的
验证某个值是否为NaN
float.lsNan() , double.IsNaN()

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Console.WriteLine(1.0 / 0.0); // Infinity 无穷大
  6. Console.WriteLine(-1.0 / 0.0); // -Infinity
  7. Console.WriteLine(1.0 / -0.0); // -Infinity
  8. Console.WriteLine(-1.0 / -0.0); // Infinity
  9. Console.WriteLine(0.0 / 0.0); // NaN I
  10. Console.WriteLine((1.0 / 0.0) - (1.0 / 0.0)); // NaN
  11. Console.WriteLine((0.0 / 0.0) == double.NaN); // False
  12. Console.WriteLine(object.Equals(0.0 / 0.0, double.NaN)); // True
  13. }
  14. }