百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

C#中的类型转换

bigegpt 2024-08-18 14:04 2 浏览

计算机存储的基本单位:字节

我们知道一个字节(Byte)有8个比特(bit)构成,比特是存储的最小单位,表示0和1,但为什么计算机存储的基本单位是字节,而不是比特呢?

假设我们要存储数字3(二进制:11),就得组织两个比特的内存才能表示,如果是255(二进制:1111 1111),就要组织8个比特的数据。数字如果更大的话,需要组织的比特位就越多,那样太麻烦了,效率也太低。那么为什么不用Kbit、Mb、Gb等作为基本单位呢?不是不可以,存储一个数字1,你用Mb作为基本单位,好多内存空间是用不到的,浪费啊。

所以要选择一个存储单位,既方便存储和管理、又能充分利用内存空间的单位。用8个比特构成一个字节,并用字节作为计算机存储的基本单位,这样是很合适的,不会因为携带的信息粒度太小而造成管理内存困难或效率低小,也不因为信息粒度太大,造成存储空间浪费。

下面这张图展示了数据在一个字节中采用二进制的存储方式,高位在前,低位在后。将每一个比特位中的值进行相加:128 + 4 + 2 = 134,所以1000 0110 表示的十进制数据是134。

存储int数据类型

int数据类型占4个字节,每个字节8位,也是高位在前低位在后,原理如图所示:



存储float数据类型



假设我们要存储浮点数 -12.5,其在内存中的存储方式如下:

(1)十进制转二进制:12.5 的二进制表示为 1100.1,具体方法如下:

将整数部分 12 转换为二进制:
12 ÷ 2 = 6 余 0
6 ÷ 2 = 3 余 0
3 ÷ 2 = 1 余 1
1 ÷ 2 = 0 余 1
逆序排列余数得到二进制整数部分:1100

2. 将小数部分 0.5 转换为二进制:小数部分乘以2,得到的结果再取小数部分乘以2

0.5 × 2 = 1.0 → 取整数部分 1

3.将 12.5 的二进制表示组合起来:1100.1

名称

比特位数目

二进制值

符号位

1 位

1

指数位

8 位

10000010

尾数位

23 位

10010000000000000000000

最终,-12.5 在内存中的二进制表示为:1 10000010 10010000000000000000000

存储其它数据类型

C#中还有其他数据类型,比如float,double,char,string等,都是采用字节组合的形式存储,高位在前、低位在后。float占4个字节,double占8个字节,char占1个字节,string是多个char类型的字符构成,有几个字符,长度就为几。

C#中的类型转换

上面介绍了不同的数据在计算机中的存储方式,有了这些知识储备我们就好理解类型转换了。所谓类型转换就是从一种数据类型转到另外一种数据类型

在 C# 中,类型转换分为隐式转换和显式转换。

隐式转换(Implicit Conversion)

隐式转换是编译器自动进行的转换,这种转换不会导致数据丢失,主要用于从较小类型到较大类型的转换。简答理解就是将小盒子里的东西装到大盒子中,例如:

byte → short(1个字节数据放到2个字节数据中)

short → int(2个字节数据放到4个字节数据中)

int → long(4个字节数据放到8个字节数据中)

float → double(4个字节数据放到8个字节数据中)

int numInt = 123;
double numDouble = numInt; // 隐式转换
Console.WriteLine(#34;numDouble: {numDouble}"); // 输出: numDouble: 123

在上述示例中,int 类型的 numInt 自动转换为 double 类型的 numDouble。这种转换不会丢失数据,因为 double 类型比 int 类型范围更大。

显式转换(Explicit Conversion)

显式转换需要使用强制转换操作符 (dataType),可能会导致数据丢失,主要用于从较大类型到较小类型的转换。例如:

double → float

long → int

int → short

double numDouble = 123.45;
int numInt = (int)numDouble; // 显式转换
Console.WriteLine(#34;numInt: {numInt}"); // 输出: numInt: 123

在上述示例中,double 类型的 numDouble 强制转换为 int 类型的 numInt,小数部分被舍弃,可能导致数据丢失。

类型转换的具体示例

数值类型的隐式转换

byte a = 10;
short b = a; // byte 隐式转换为 short
int c = b; // short 隐式转换为 int
long d = c; // int 隐式转换为 long
float e = d; // long 隐式转换为 float
double f = e; // float 隐式转换为 double
Console.WriteLine(#34;double: {f}"); // 输出: double: 10

数值类型的显式转换

double x = 123.45;
float y = (float)x; // double 显式转换为 float
long z = (long)y; // float 显式转换为 long
int w = (int)z; // long 显式转换为 int
short v = (short)w; // int 显式转换为 short
byte u = (byte)v; // short 显式转换为 byte
Console.WriteLine(#34;byte: {u}"); // 输出: byte: 123

使用Convert 类进行类型转换

C# 提供了 Convert 类,用于执行更安全和更全面的类型转换,适用于各种数据类型之间的转换,下面是一些常见的使用场景及示例,具体有哪些方法可以去Convert 类的定义出查看。

数值类型转换

// int 转换为 double
int intValue = 123;
double doubleValue = Convert.ToDouble(intValue);
Console.WriteLine(#34;int to double: {doubleValue}");

// double 转换为 int
double doubleValue2 = 123.45;
int intValue2 = Convert.ToInt32(doubleValue2);
Console.WriteLine(#34;double to int: {intValue2}");

// string 转换为 int
string strValue = "456";
int intValue3 = Convert.ToInt32(strValue);
Console.WriteLine(#34;string to int: {intValue3}");

// string 转换为 double
string strValue2 = "789.01";
double doubleValue3 = Convert.ToDouble(strValue2);
Console.WriteLine(#34;string to double: {doubleValue3}");

布尔类型转换

// string 转换为 bool
string trueString = "true";
bool boolValue = Convert.ToBoolean(trueString);
Console.WriteLine(#34;string to bool: {boolValue}");

// int 转换为 bool
int zero = 0;
int one = 1;
bool boolValue2 = Convert.ToBoolean(zero);
bool boolValue3 = Convert.ToBoolean(one);
Console.WriteLine(#34;int 0 to bool: {boolValue2}");
Console.WriteLine(#34;int 1 to bool: {boolValue3}");

日期类型转换

// string 转换为 DateTime
string dateString = "2024-07-06";
DateTime dateValue = Convert.ToDateTime(dateString);
Console.WriteLine(#34;string to DateTime: {dateValue}");

// DateTime 转换为 string
DateTime now = DateTime.Now;
string dateString2 = Convert.ToString(now);
Console.WriteLine(#34;DateTime to string: {dateString2}");

其他类型转换

// char 转换为 int
char charValue = 'A';
int intValue = Convert.ToInt32(charValue);
Console.WriteLine(#34;char to int: {intValue}");

// int 转换为 char
int intValue2 = 66;
char charValue2 = Convert.ToChar(intValue2);
Console.WriteLine(#34;int to char: {charValue2}");

// object 转换为 string
object objValue = 123;
string strValue = Convert.ToString(objValue);
Console.WriteLine(#34;object to string: {strValue}");


Parse 和 TryParse 方法

在 C# 中,Parse 和 TryParse 方法用于将字符串转换为数值类型,如整数、浮点数等。这两个方法的主要区别在于错误处理机制。

Parse 方法

Parse 方法用于将字符串转换为指定的数据类型,如果转换失败,则会抛出异常。

适用场景: 适用于可以确定输入字符串格式正确的情况下使用。

string str = "123";
int number = int.Parse(str); // 成功转换
Console.WriteLine(number); // 输出: 123

string invalidStr = "abc";
int invalidNumber = int.Parse(invalidStr); // 抛出 FormatException

TryParse 方法

TryParse 方法尝试将字符串转换为指定的数据类型,并返回一个布尔值指示转换是否成功。它不会抛出异常,而是通过输出参数返回转换结果。

适用场景: 适用于不确定输入字符串格式是否正确的情况下使用,避免程序因异常而崩溃。

string str = "123";
bool success = int.TryParse(str, out int number);
if (success)
{
				Console.WriteLine(number); // 输出: 123
}
else
{
				Console.WriteLine("转换失败");
}

string invalidStr = "abc";
success = int.TryParse(invalidStr, out int invalidNumber);
if (success)
{
				Console.WriteLine(invalidNumber);
}
else
{
				Console.WriteLine("转换失败"); // 输出: 转换失败
}

方法比较

特点

Parse

TryParse

返回值

转换后的值

布尔值(成功或失败)

错误处理

抛出异常

不抛异常,返回 false

性能

较慢(抛异常)

较快(无异常)

适用场景

确信格式正确

格式不确定或健壮性需求

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...