Reference Source

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();
        }
    }
}

测试运行如图

C#中Convert与强制转换之间的区别-LMLPHP

 

12-06 03:48