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();
}
}
}
测试运行如图