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


    Reference Source

    Convert与强转最大的区别是 增加了范围校验,如果不在范围内,直接抛出异常

    Convert 类 (System) | Microsoft Learn

    小数转化为整数

    使用基本数据类型强制转化原理:小数转化为整数,舍弃小数点后的所有数字。

    C#中小数转化为整数,Convert转换原理如下:如果小数部分小于0.5,或者小数部分大于0.5,则按照四舍五入的方式获取整数
    C#中小数转化为整数,Convert转换原理如下:如果小数部分等于0.5,则返回最接近的偶数,即返回的偶数与原小数的差的绝对值相差0.5

    微软源程序

    1. public static int ToInt32(double value) {
    2. if (value >= 0) {
    3. if (value < 2147483647.5) {
    4. int result = (int)value;
    5. double dif = value - result;
    6. if (dif > 0.5 || dif == 0.5 && (result & 1) != 0) result++;
    7. return result;
    8. }
    9. }
    10. else {
    11. if (value >= -2147483648.5) {
    12. int result = (int)value;
    13. double dif = value - result;
    14. if (dif < -0.5 || dif == -0.5 && (result & 1) != 0) result--;
    15. return result;
    16. }
    17. }
    18. throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
    19. }

    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,本质也是【除基取余】的过程

    测试程序如下:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace ConvertAndCastDemo
    7. {
    8. internal class Program
    9. {
    10. static void Main(string[] args)
    11. {
    12. double dd = 678.876D;
    13. Console.WriteLine((byte)dd);
    14. Console.WriteLine("使用基本数据类型强制转化原理:小数转化为整数,舍弃小数点后的所有数字");
    15. int x = (int)123.876;
    16. Console.WriteLine(x);
    17. Console.WriteLine("使用基本数据类型强制转化原理:原整数A转化为另一种目标整数B,首先将原整数A转化为对应的无符号整数C,然后将C对(B的最大值+1)取余即可");
    18. x = 456;
    19. byte b = (byte)x;
    20. Console.WriteLine(b);
    21. Console.WriteLine($"整数【{x}】在内存中的字节流储存为:{string.Join(",", BitConverter.GetBytes(x))}");
    22. Console.WriteLine($"所谓强制转化byte,本质就是【二进制截断为{sizeof(byte)}个字节】的过程:{b}={BitConverter.GetBytes(x)[0]}");
    23. Console.WriteLine($"所谓强制转化byte,本质也是【除基取余】的过程:{b}={x}%{byte.MaxValue + 1}");
    24. x = 123456789;
    25. ushort usht = (ushort)x;
    26. Console.WriteLine($"整数【{x}】在内存中的字节流储存为:{string.Join(",", BitConverter.GetBytes(x))}");
    27. Console.WriteLine($"无符号短整型【{usht}】在内存中的字节流储存为:{string.Join(",", BitConverter.GetBytes(usht))}");
    28. Console.WriteLine($"所谓强制转化ushort,本质就是【二进制截断为{sizeof(ushort)}个字节】的过程:{usht}={BitConverter.ToUInt16(BitConverter.GetBytes(x), 0)}");
    29. Console.WriteLine($"所谓强制转化ushort,本质也是【除基取余】的过程:{usht}={x}%{ushort.MaxValue + 1}");
    30. Console.WriteLine("对于负整数来说,本质也是先强制转化为对应的正整数,如int--->uint,short--->ushort");
    31. Console.WriteLine("负整数的二进制补码原理为:最高位为1,其他位是其绝对值正整数的除最高位不转化外,其他全部取反,然后最低位加1");
    32. Console.WriteLine("比如负数-1,第一次转化为【10000000 00000000 00000000 00000001】,最高位1不变其他位取反转化为【11111111 11111111 11111111 11111110】");
    33. Console.WriteLine("最后最低位加上1,即为【11111111 11111111 11111111 11111111】,也就是十六进制的【0xFFFFFFFF】");
    34. Console.WriteLine("C#中小数转化为整数,Convert转换原理如下:如果小数部分小于0.5,或者小数部分大于0.5,则按照四舍五入的方式获取整数");
    35. Console.WriteLine("C#中小数转化为整数,Convert转换原理如下:如果小数部分等于0.5,则返回最接近的偶数,即返回的偶数与原小数的差的绝对值相差0.5");
    36. Console.WriteLine(Convert.ToInt32(233.5));
    37. Console.WriteLine(Convert.ToInt32(234.5));
    38. Console.WriteLine(Convert.ToInt32(-129.5));
    39. Console.WriteLine(Convert.ToInt32(-130.5));
    40. Console.WriteLine(Convert.ToInt32(789.456));
    41. Console.WriteLine(Convert.ToInt32(-987.567));
    42. Console.WriteLine("Convert可以对null进行转化,返回0");
    43. Console.WriteLine(Convert.ToInt32(null));
    44. Console.WriteLine("Convert与强制转化最大的区别就是Convert有范围检查");
    45. try
    46. {
    47. Console.WriteLine(Convert.ToByte(x));
    48. }
    49. catch (Exception ex)
    50. {
    51. Console.WriteLine($"【{ex.GetType()}】:{ex.Message}");
    52. }
    53. string s = "123.456";
    54. try
    55. {
    56. Console.WriteLine(Convert.ToInt32(s));
    57. }
    58. catch (Exception ex)
    59. {
    60. Console.WriteLine($"【{ex.GetType()}】:{ex.Message}");
    61. }
    62. Console.ReadLine();
    63. }
    64. }
    65. }

    测试运行如图

     

  • 相关阅读:
    不知道怎么把英文文档翻译成中文?手把手教你怎么操作
    设计模式15——享元模式
    如何安装JetPack?
    39 | selenium基础架构,UI测试架构
    JavaScript-----元素可视区client
    4520. 质数
    华为云Astro的前世今生:用7年时间革新低代码开发观念
    vue3兄弟组件传值mitt
    左偏树
    吴恩达深度学习笔记(七)——机器学习策略
  • 原文地址:https://blog.csdn.net/ylq1045/article/details/128114314