浅谈C#基本数字数据类型

 

数据类型
类型
描             述
bit
整型
bit 数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或Fa lse 、On 或Off
int
整型
int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占用4个字节
smallint
整型
smallint 数据类型可以存储从- 215(-32768)到215(32767)之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间
tinyint
整型
tinyint 数据类型能存储从0到255 之间的整数。它在你只打算存储有限数目的数值时很有用。 这种数据类型在数据库中占用1 个字节
numeric
精确数值型
numeric数据类型与decimal 型相同
decimal
精确数值型
decimal 数据类型能用来存储从-1038-1到1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。 范围是小数点左右所能存储的数字的总位数。精度是小数点右边存储的数字的位数
money
货币型
money 数据类型用来表示钱和货币值。这种数据类型能存储从-9220亿到9220 亿之间的数据,精确到货币单位的万分之一
smallmoney
货币型
smallmoney 数据类型用来表示钱和货币值。这种数据类型能存储从-214748.3648 到214748.3647 之间的数据,精确到货币单位的万分之一
float
近似数值型
float 数据类型是一种近似数值类型,供浮点数使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308到1.79E+308 之间的任意数
real
近似数值型
real 数据类型像浮点数一样,是近似数值类型。它可以表示数值在-3.40E+38到3.40E+38之间的浮点数
datetime
日期时间型
datetime数据类型用来表示日期和时间。这种数据类型存储从1753年1月1日到9999年12月3 1日间所有的日期和时间数据, 精确到三百分之一秒或3.33毫秒
Smalldatetime
日期时间型
smalldatetime 数据类型用来表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟
cursor
特殊数据型
cursor 数据类型是一种特殊的数据类型,它包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用
timestamp
特殊数据型
timestamp 数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。 一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”, 但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的
Uniqueidentifier
特殊数据型
Uniqueidentifier数据类型用来存储一个全局唯一标识符,即GUID。GUID确实是全局唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID 函数或转换一个字符串为唯一标识符来初始化具有唯一标识符的列
char
字符型
char数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000 个字符
varchar
字符型
varchar数据类型,同char类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。 它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度
text
字符型
text 数据类型用来存储大量的非统一编码型字符数据。这种数据类型最多可以有231-1或20亿个字符
nchar
统一编码字符型
nchar 数据类型用来存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍
nvarchar
统一编码字符型
nvarchar 数据类型用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍
ntext
统一编码字符型
ntext 数据类型用来存储大量的统一编码字符型数据。这种数据类型能存储230 -1或将近10亿个字符,且使用的字节空间增加了一倍
binary
二进制数据类型
binary数据类型用来存储可达8000 字节长的定长的二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型
varbinary
二进制数据类型
varbinary 数据类型用来存储可达8000 字节长的变长的二进制数据。当输入表的内容大小可变时,你应该使用这种数据类型
image
二进制数据类型
image 数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节

 
共分1页  [1] 

众所周知,像“int a = 10; short b = a“这样的语句是无法编译通过的,原因是cannot implicitly convert type 'int' to 'short'。而我写上“short = 10”这样的语句是没有问题的,即没有错误也没有警告,这是为什么呢,难道编译器自动帮我加上强制类型转换?为了揭开这些方面的谜题,我做了些测试,因此有了本文。

C#基本数字数据类型一共有11种,其中8种整数类型(byte, sbyte, short, ushort, int, uint, long, ulong),3种可带小数类型(double, float, decimal).首先,我对8种整数类型做了如下测试:

    class Program
    {
        public static byte _byte;
        public static sbyte _sbyte;
        public static short _short;
        public static ushort _ushort;
        public static int _int;
        public static uint _uint;
        public static long _long;
        public static ulong _ulong;

        public static byte _byte2;
        public static short _short2;
        public static uint _uint2;
        public static long _long2;
       
        static void Main(string[] args)
        {
            _byte = 20;
            _sbyte = 20;
            _short = 20;
            _ushort = 20;
            _int = 20;
            _uint = 20;
            _long = 20;
            _ulong = 20;

            _byte2 = (byte)20;
            _short2 = (short)20;
            _uint2 = 20U;
            _long2 = 20L;
        }
    }

生成的IL代码如下:



.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       89 (0x59)
  .maxstack  1
  IL_0000:  nop
  IL_0001:  ldc.i4.s   20
  IL_0003:  stsfld     uint8 ConsoleApplication1.Program::_byte
  IL_0008:  ldc.i4.s   20
  IL_000a:  stsfld     int8 ConsoleApplication1.Program::_sbyte
  IL_000f:  ldc.i4.s   20
  IL_0011:  stsfld     int16 ConsoleApplication1.Program::_short
  IL_0016:  ldc.i4.s   20
  IL_0018:  stsfld     uint16 ConsoleApplication1.Program::_ushort
  IL_001d:  ldc.i4.s   20
  IL_001f:  stsfld     int32 ConsoleApplication1.Program::_int
  IL_0024:  ldc.i4.s   20
  IL_0026:  stsfld     uint32 ConsoleApplication1.Program::_uint
  IL_002b:  ldc.i4.s   20
  IL_002d:  conv.i8
  IL_002e:  stsfld     int64 ConsoleApplication1.Program::_long
  IL_0033:  ldc.i4.s   20
  IL_0035:  conv.i8
  IL_0036:  stsfld     uint64 ConsoleApplication1.Program::_ulong
  IL_003b:  ldc.i4.s   20
  IL_003d:  stsfld     uint8 ConsoleApplication1.Program::_byte2
  IL_0042:  ldc.i4.s   20
  IL_0044:  stsfld     int16 ConsoleApplication1.Program::_short2
  IL_0049:  ldc.i4.s   20
  IL_004b:  stsfld     uint32 ConsoleApplication1.Program::_uint2
  IL_0050:  ldc.i4.s   20
  IL_0052:  conv.i8
  IL_0053:  stsfld     int64 ConsoleApplication1.Program::_long2
  IL_0058:  ret
} // end of method Program::Main


我们发现,_byte = 20 与 _byte = (byte)20 生成的代码一模一样,_long = 20 与 _long = 20L生成的代码也一模一样。因此,结合一些其他测试(这里省略) ,我们得出以下结论:
1、_byte = 20 与 _byte = (byte)20 的效益一样。
2、_long = 20 与 _long = 20L 的效益一样,20L中的“L”仅仅在编译中起作用。
3、编译器会自动检测直接赋的值是否超过该类型所能表示的最大范围. ( _byte = 256 会导致编译出错)


接下来我们对double,float,decimal进行测试:(注释的行表示会导致编译无法通过)

    class Program
    {
        public static float _float;
        public static double _double;
        public static decimal _decimal;
 
        static void Main(string[] args)
        {
            _float = 5;
            //_float = 5.0;
            _float = 5F;
            //_float = 5M;

            _double = 5;
            _double = 5.0;
            _double = 5F;
            //_double = 5M;

            _decimal = 5;
            //_decimal = 5.0;
            _decimal = 5.0M;
            //_decimal = 5.0F;
        }
    }

IL代码如下:
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       91 (0x5b)
  .maxstack  6
  IL_0000:  nop
  IL_0001:  ldc.r4     5.
  IL_0006:  stsfld     float32 ConsoleApplication1.Program::_float
  IL_000b:  ldc.r4     5.
  IL_0010:  stsfld     float32 ConsoleApplication1.Program::_float
  IL_0015:  ldc.r8     5.
  IL_001e:  stsfld     float64 ConsoleApplication1.Program::_double
  IL_0023:  ldc.r8     5.
  IL_002c:  stsfld     float64 ConsoleApplication1.Program::_double
  IL_0031:  ldc.r8     5.
  IL_003a:  stsfld     float64 ConsoleApplication1.Program::_double
  IL_003f:  ldc.i4.5
  IL_0040:  newobj     instance void [mscorlib]System.Decimal::.ctor(int32)
  IL_0045:  stsfld     valuetype [mscorlib]System.Decimal ConsoleApplication1.Program::_decimal
  IL_004a:  ldc.i4.s   50
  IL_004c:  ldc.i4.0
  IL_004d:  ldc.i4.0
  IL_004e:  ldc.i4.0
  IL_004f:  ldc.i4.1
  IL_0050:  newobj     instance void [mscorlib]System.Decimal::.ctor(int32,
                                                                     int32,
                                                                     int32,
                                                                     bool,
                                                                     uint8)
  IL_0055:  stsfld     valuetype [mscorlib]System.Decimal ConsoleApplication1.Program::_decimal
  IL_005a:  ret
} // end of method Program::Main

结论:
1、跟整数类型不同,带小数类型在直接赋数值时必须指定相应数值类型 或 可由该默认数值类型隐式转化为该变量类型。
2、_float = 5 与 _float = 5F 的效率一样。"F" 同样只在编译中起作用。
3、decimal类型的赋值跟其它类型有些不同,查decimal的构造方法发现,它有9个公有构造方法。

以上就是我对数值类型的简单分析,如有不足或错误,欢迎大家指出。

附:
    L 表示 long
    D 表示 double
    F 表示 float
    M 表示 decimal
    U 表示 uint
    UL 表示 ulong

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值