C#中的数值类型转换是以数据的存储方式(即内存或寄存器中的存储数据)为依据的。而现在的计算机内存中普遍以补码方式存储数值数据,这就意味着在类型转换时以该补码为转换依据。记住这一点是很重要的。为理解方便,这里只举例说明。
1、short转int。
这属于隐式类型转换,数值不变,理解起来也很容易,不多说了。
2、int转short。
这需要强制类型转换,数值可能改变。在转换时舍弃其补码的高位两个字节(连同符号位)。如:(short)int.MinValue的结果为0。
3、int转uint。
这属于隐式类型转换,数值可能改变。int和uint都占4个字节,在转换时不需要舍弃字节。补码亦不发生变化。但是要注意,uint的最高位隐藏着符号位0,即"0+补码"才是uint的真正补码。这一隐藏符号位是虚构出来的,方便理解。
其他形式的转换就不再赘述了。总之,数值类型转换万变不离其宗,要以数值的存储方式为依据,在增加字节时考虑符号位的作用,而在舍弃字节时便把符号位看做一般数据位。如此,就很难再出错了。
1、short转int。
这属于隐式类型转换,数值不变,理解起来也很容易,不多说了。
2、int转short。
这需要强制类型转换,数值可能改变。在转换时舍弃其补码的高位两个字节(连同符号位)。如:(short)int.MinValue的结果为0。
3、int转uint。
这属于隐式类型转换,数值可能改变。int和uint都占4个字节,在转换时不需要舍弃字节。补码亦不发生变化。但是要注意,uint的最高位隐藏着符号位0,即"0+补码"才是uint的真正补码。这一隐藏符号位是虚构出来的,方便理解。
其他形式的转换就不再赘述了。总之,数值类型转换万变不离其宗,要以数值的存储方式为依据,在增加字节时考虑符号位的作用,而在舍弃字节时便把符号位看做一般数据位。如此,就很难再出错了。