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

    技术2022-05-20  32

     

    数据类型 类型 描             述 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


    最新回复(0)