Convert与强转最大的区别是 增加了范围校验,如果不在范围内,直接抛出异常
Convert 类 (System) | Microsoft Learn
使用基本数据类型强制转化原理:小数转化为整数,舍弃小数点后的所有数字。
C#中小数转化为整数,Convert转换原理如下:如果小数部分小于0.5,或者小数部分大于0.5,则按照四舍五入的方式获取整数
C#中小数转化为整数,Convert转换原理如下:如果小数部分等于0.5,则返回最接近的偶数,即返回的偶数与原小数的差的绝对值相差0.5
- public static int ToInt32(double value) {
- if (value >= 0) {
- if (value < 2147483647.5) {
- int result = (int)value;
- double dif = value - result;
- if (dif > 0.5 || dif == 0.5 && (result & 1) != 0) result++;
- return result;
- }
- }
- else {
- if (value >= -2147483648.5) {
- int result = (int)value;
- double dif = value - result;
- if (dif < -0.5 || dif == -0.5 && (result & 1) != 0) result--;
- return result;
- }
- }
- throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
- }
Convert.ToInt32(3.5)和Convert.ToInt32(4.5) 都是返回4
使用基本数据类型强制转化原理:原整数A转化为另一种目标整数B,首先将原整数A转化为对应的无符号整数C,然后将C对(B的最大值+1)取余即可。
其中 sbyte对应byte
short对应ushort
int对应uint
long对应ulong
所谓强制转化ushort,本质就是【二进制截断为{sizeof(ushort)}个字节】的过程
所谓强制转化ushort,本质也是【除基取余】的过程
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace ConvertAndCastDemo
- {
- internal class Program
- {
- static void Main(string[] args)
- {
- double dd = 678.876D;
- Console.WriteLine((byte)dd);
- Console.WriteLine("使用基本数据类型强制转化原理:小数转化为整数,舍弃小数点后的所有数字");
- int x = (int)123.876;
- Console.WriteLine(x);
- Console.WriteLine("使用基本数据类型强制转化原理:原整数A转化为另一种目标整数B,首先将原整数A转化为对应的无符号整数C,然后将C对(B的最大值+1)取余即可");
- x = 456;
- byte b = (byte)x;
- Console.WriteLine(b);
- Console.WriteLine($"整数【{x}】在内存中的字节流储存为:{string.Join(",", BitConverter.GetBytes(x))}");
- Console.WriteLine($"所谓强制转化byte,本质就是【二进制截断为{sizeof(byte)}个字节】的过程:{b}={BitConverter.GetBytes(x)[0]}");
- Console.WriteLine($"所谓强制转化byte,本质也是【除基取余】的过程:{b}={x}%{byte.MaxValue + 1}");
- x = 123456789;
- ushort usht = (ushort)x;
- Console.WriteLine($"整数【{x}】在内存中的字节流储存为:{string.Join(",", BitConverter.GetBytes(x))}");
- Console.WriteLine($"无符号短整型【{usht}】在内存中的字节流储存为:{string.Join(",", BitConverter.GetBytes(usht))}");
- Console.WriteLine($"所谓强制转化ushort,本质就是【二进制截断为{sizeof(ushort)}个字节】的过程:{usht}={BitConverter.ToUInt16(BitConverter.GetBytes(x), 0)}");
- Console.WriteLine($"所谓强制转化ushort,本质也是【除基取余】的过程:{usht}={x}%{ushort.MaxValue + 1}");
-
- Console.WriteLine("对于负整数来说,本质也是先强制转化为对应的正整数,如int--->uint,short--->ushort");
- Console.WriteLine("负整数的二进制补码原理为:最高位为1,其他位是其绝对值正整数的除最高位不转化外,其他全部取反,然后最低位加1");
- Console.WriteLine("比如负数-1,第一次转化为【10000000 00000000 00000000 00000001】,最高位1不变其他位取反转化为【11111111 11111111 11111111 11111110】");
- Console.WriteLine("最后最低位加上1,即为【11111111 11111111 11111111 11111111】,也就是十六进制的【0xFFFFFFFF】");
- Console.WriteLine("C#中小数转化为整数,Convert转换原理如下:如果小数部分小于0.5,或者小数部分大于0.5,则按照四舍五入的方式获取整数");
- Console.WriteLine("C#中小数转化为整数,Convert转换原理如下:如果小数部分等于0.5,则返回最接近的偶数,即返回的偶数与原小数的差的绝对值相差0.5");
- Console.WriteLine(Convert.ToInt32(233.5));
- Console.WriteLine(Convert.ToInt32(234.5));
- Console.WriteLine(Convert.ToInt32(-129.5));
- Console.WriteLine(Convert.ToInt32(-130.5));
- Console.WriteLine(Convert.ToInt32(789.456));
- Console.WriteLine(Convert.ToInt32(-987.567));
-
- Console.WriteLine("Convert可以对null进行转化,返回0");
- Console.WriteLine(Convert.ToInt32(null));
- Console.WriteLine("Convert与强制转化最大的区别就是Convert有范围检查");
- try
- {
- Console.WriteLine(Convert.ToByte(x));
- }
- catch (Exception ex)
- {
- Console.WriteLine($"【{ex.GetType()}】:{ex.Message}");
- }
- string s = "123.456";
- try
- {
- Console.WriteLine(Convert.ToInt32(s));
- }
- catch (Exception ex)
- {
- Console.WriteLine($"【{ex.GetType()}】:{ex.Message}");
- }
- Console.ReadLine();
- }
- }
- }