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

news2024/12/26 0:02:12

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

测试运行如图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTTP响应是什么?

文章目录HTTP响应1. 响应行2. 响应头3. 空行与响应体4. HTTP响应示例HTTP响应 当客户端发起一个请求后&#xff0c;一般都会得到一个服务器的响应&#xff0c;断网或者服务器宕机的情况下除外。服务器发送给客户端的 HTTP 响应用于向客户端提供其请求的资源&#xff0c;以及客…

开源项目-绩效管理系统

开源项目-绩效管理系统 哈喽&#xff0c;今天给大家带来一个开源系统-绩效管理系统 源码下载​​​​​​​ 系统介绍 本系统为绩效考核系统&#xff0c;系统分为三大模块&#xff1a;考核设置&#xff0c;绩效考核&#xff0c;系统管理。 可满足小企业对员工进行考核。本系…

自定义maven骨架的添加与删除——完整详细介绍

目录一、创建好自己所需的目录结构二、命令配置2.1 配置总览2.2 指令配置说明2.3 指令配置详情三、配置Idea中maven新模板3.1 找到信息文件3.2 创建实例模板四、删除自定义模板4.1 删除本地仓库中的文件4.2 删除archetype-catalog.xml文件中的配置4.3 删除idea中的配置一、创建…

傻白入门芯片设计,指令集架构、微架构、处理器内核(十一)

早期计算机出现时&#xff0c;软件的编写都是直接面向硬件系统的&#xff0c;即使是同一计算机公司的不同计算机产品&#xff0c;它们的软件都是不能通用的,这个时代的软件和硬件紧密的耦合在一起&#xff0c;不可分离。 IBM为了让自己的一系列计算机能使用相同的软件,免去重复…

毕业设计-深度学习机器视觉铝型材表面缺陷识别

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

excel表格怎么换行?单元格内换行的4个方法

今天分享一个excel单元格内换行的小技巧&#xff0c;希望对大家有用。我们在编辑excel文本时经常会遇到这样的情况&#xff1a;将文字内容用一种方式快速从中间插入。比如我们在制作表格时&#xff0c;要将区域内的数据全部合并到一张表格中&#xff08;即单元格区域&#xff0…

破茧化蝶,从Ring Bus到Mesh网络,CPU片内总线的进化之路

文章目录**为什么需要片内总线&#xff1f;****星型连接****环形总线&#xff08;Ring Bus&#xff09;****Mesh网络****结论**转载于&#xff1a;https://zhuanlan.zhihu.com/p/32216294 在大多数普通用户眼里&#xff0c;CPU也许就是一块顶着铁盖子的电路板而已。但是如果我…

【基于Tansformer的融合方法:感知损失:传递-感知损失】

HyperTransformer: A Textural and Spectral Feature Fusion Transformer for Pansharpening &#xff08;超级Transformer&#xff1a;一种用于全色锐化的纹理和光谱特征融合Transformer&#xff09; 先看这一篇简单了解Transformer &#xff08;是一篇高光谱图像融合&#x…

[附源码]计算机毕业设计JAVA疫情背景下叮当买菜管理系统

[附源码]计算机毕业设计JAVA疫情背景下叮当买菜管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

postgresql_internals-14 记录

梳理一下之前理解不太清楚的知识点&#xff0c;重点内容可能会再拆出来单独研究。 原书链接&#xff1a;Index of / 一、 数据组织 1. pg系统库 template0&#xff1a;用于从逻辑备份还原&#xff0c;或创建不同字符集的数据库&#xff0c;不可以修改template1&#xff1a;真…

i.MX 6ULL 驱动开发 二十九:向 Linux 内核中添加自己编写驱动

一、概述 Linux 内核编译流程如下&#xff1a; 1、配置 Linux 内核。 2、编译 Linux 内核。 说明&#xff1a;进入 Linux 内核源码&#xff0c;使用 make help 参看相关配置。 二、make menuconfig 工作原理 1、menuconfig 它本身是一个软件&#xff0c;只提供图形界面配…

Android App 秒开实践方案~

一、背景 启动速度可以说是一个 APP 的门面&#xff0c;对用户体验至关重要。随着业务不断增加&#xff0c;需要初始化的任务也越来越多&#xff0c;如果放任不管&#xff0c;启动时长会逐步增加&#xff0c;为此雪球客户端针对应用启动时长做了大量优化工作。本文从应用启动基…

[读论文] Monocular 3D Object Reconstruction with GAN inversion (ECCV2022)

概述 项目主页&#xff1a;https://www.mmlab-ntu.com/project/meshinversion/ 方法名称&#xff1a;MeshInversion 输入&#xff1a;单目图像 &#xff08;in the wild&#xff0c;有背景的&#xff0c;没有抠图的&#xff09; 输出&#xff1a;textured 3D mesh key challen…

【metaRTC学习】metaRTC的demo运行说明(一)

metaRTC的github的地址为&#xff1a;GitHub - metartc/metaRTC: A cross-platform WebRTC SDK 其作者杨高峰的博客为&#xff1a;metaRTC的博客_CSDN博客-metaRTC,解决方案领域博主 其博客对其自己的demo的运行说明不够详细&#xff0c;刚入门的会一脸懵&#xff0c;本文对其…

Netty(二)- NIO三大组件之Buffer

文章目录一、Buffer 基本介绍二、Buffer 类及其子类三、Buffer 的使用四、关于Buffer 的注意事项和细节1. put和get的数据类型应该相同2. 可以将一个普通 Buffer 转成只读 Buffer3. 可以使用MappedByteBuffer让文件直接在内存中修改4. 可以通过 Buffer 数组完成读写操作&#x…

富文本编辑器 ck-editor5 的使用

最近在项目中需要用到富文本编辑器&#xff0c;据说ck-editor5很不错&#xff0c;于是就使用它了&#xff0c;不过在期间也遇到了很多问题&#xff0c;这里记录下。 一、引入ck-editor5 文档地址&#xff1a;Predefined builds - CKEditor 5 Documentation 这里有个坑&#…

YOLOv2-yolo9000-batter,faster,stronger 论文精度

参考大佬&#xff1a;同济子豪兄 YOLOv2-yolo9000 yolo9000-batter,faster,stronger Introduction 我们提出了一种新的方法来利用大量的图像分类数据&#xff0c;来扩大当前检测系统的范围。我们的方法使用目标分类的分层视图&#xff0c;允许我们将不同的数据集组合在一起…

个人需求1:代码提交这块的做法

老早之前的代码提交的步骤&#xff0c;真的是很繁琐在这里提交代码&#xff0c;现在和大家分析一下我当初的心得。 1.首先黄老师建立了一个jira号,记得把功能背景/方案说明/测试范围提前了解,问起来的时候也能回答,如下图1: 15324就是我本次的jira号,每次开发前先建立jira号,这…

小区访客导航GIS方案

1 应用功能设计 1.1 小区地图 1.1.1 小区地图浏览 基于GIS平台&#xff0c;对小区地图进行渲染发布&#xff0c;提供可视化显示浏览地图可以选择2D地图模式&#xff0c;用户可以在地图上快速查询和点击选择某个小区内的建筑物、POI等信息&#xff0c;并查看其相关属性信息&…

【现代机器人学】学习笔记二:刚体运动

这一节内容最开始在学之前是有些不屑的&#xff0c;这些坐标变换的内容天天都在玩&#xff0c;有什么复杂的&#xff1f;高翔博士的14讲貌似讲这些内容只用了几页。 不过认真一读才发现自己自大肤浅了。 之前我在北大研究院的时候&#xff0c;有一个实验室双聘的浙农林的老师&…