网站首页 > 技术文章 正文
计算机存储的基本单位:字节
我们知道一个字节(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 |
性能 | 较慢(抛异常) | 较快(无异常) |
适用场景 | 确信格式正确 | 格式不确定或健壮性需求 |
猜你喜欢
- 2024-11-12 C#-练习题 014(c#程序题及答案)
- 2024-11-12 C# 类型转换(c类型转换有哪三种形式)
- 2024-11-12 C#-无参数有返回值的方法 060(有参无返回值 c语言)
- 2024-11-12 C#中的值类型和引用类型(c# 引用类型)
- 2024-11-12 abelkhan中的rpc框架(rpc框架应用场景)
- 2024-11-12 C#编程零基础到入门学习-C# 值类型和引用类型(4-8)
- 2024-11-12 2.6 C#的常用关键字和预定义类型(c#预留关键字)
- 2024-11-12 C#_图片拖拽(c#窗体图片移动)
- 2024-11-12 数据类型 - C#入门教程(c#常见数据类型)
- 2024-11-12 C#中堆栈(Stack)和堆(Heap)的区别——第一部分
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)