优秀的编程知识分享平台

网站首页 > 技术文章 正文

C#中的类型转换(c#数据转换类)

nanyue 2024-11-12 11:46:26 技术文章 1 ℃

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

我们知道一个字节(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

性能

较慢(抛异常)

较快(无异常)

适用场景

确信格式正确

格式不确定或健壮性需求

Tags:

最近发表
标签列表