c# 基本类型存储方式的研究
基本单位
二进制,当前的计算机系统使用的基本上是二进制系统。
二进制的单位是位,每一位可以表示2个数: 0或1。
byte(字节) 有8位,可以表示的数为2的8次方,即256个数,范围为【0-255】。
数字类型
下面是自己整理的C#类型大小,如果存在错误,望指正。
int 有32位,可以转化为byte[4]。可以表示 4,294,967,296(2的32次方的)个数字,范围为【-2,147,483,648,2,147,483,647】
char 类型
说到char类型,首先必须考虑编码,不同的编码方式对应不同的字符。这里的编码方式属于文字编码。
字符串编码是字符和数字的对应关系。一个数字对应一个字符,一个字符对应一个数字。
这个东西源远流长,说清楚不太容易,感兴趣的可以看这篇文章:
https://www.cnblogs.com/criedshy/archive/2012/08/07/2625358.html
只说几点:
1、Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。不包括实现。
2、UTF32,UTF7(被淘汰),UTF8,UTF16是Unicode的实现方式。
3、C#中的UniCode指的是UTF-16
4、
下面是一组测试
public void StartTest()
{
Console.WriteLine("Char编码的探讨");
TestOneEncode("ascii"); TestOneEncode("gb2312"); TestOneEncode("unicode");
TestOneEncode("utf-8");
TestOneEncode("utf-16");
TestOneEncode("utf-32");
} private static void TestOneEncode(string encodeName)
{
Encoding encoding = Encoding.GetEncoding(encodeName);
Console.WriteLine($"'a'使用 {encodeName} 编码,每个字节对应的数字为:{ string.Join(",", encoding.GetBytes(new[] { 'a' }))}");
Console.WriteLine($"'a'使用 {encodeName} 编码,再使用 {encodeName} 解码,得到:{ encoding.GetChars(encoding.GetBytes(new[] { 'a' }))[0]}");
Console.WriteLine($"'、'使用 {encodeName} 编码,每个字节对应的数字为:{ string.Join(",", encoding.GetBytes(new[] { '、' }))}");
Console.WriteLine($"'、'使用 {encodeName} 编码,再使用 {encodeName} 解码,得到:{ encoding.GetChars(encoding.GetBytes(new[] { '、' }))[0]}");
Console.WriteLine($"'中'使用 {encodeName} 编码,每个字节对应的数字为:{ string.Join(",", encoding.GetBytes(new[] { '中' }))}");
Console.WriteLine($"'中'使用 {encodeName} 编码,再使用 {encodeName} 解码,得到:{ encoding.GetChars(encoding.GetBytes(new[] { '中' }))[0]}");
Console.WriteLine();
}
关键部分测试代码,没有什么技术含量
下面是输出
Char编码的探讨
'a'使用 ascii 编码,每个字节对应的数字为:97
'a'使用 ascii 编码,再使用 ascii 解码,得到:a
'、'使用 ascii 编码,每个字节对应的数字为:63
'、'使用 ascii 编码,再使用 ascii 解码,得到:?
'中'使用 ascii 编码,每个字节对应的数字为:63
'中'使用 ascii 编码,再使用 ascii 解码,得到:?
'a'使用 gb2312 编码,每个字节对应的数字为:97
'a'使用 gb2312 编码,再使用 gb2312 解码,得到:a
'、'使用 gb2312 编码,每个字节对应的数字为:161,162
'、'使用 gb2312 编码,再使用 gb2312 解码,得到:、
'中'使用 gb2312 编码,每个字节对应的数字为:214,208
'中'使用 gb2312 编码,再使用 gb2312 解码,得到:中
'a'使用 unicode 编码,每个字节对应的数字为:97,0
'a'使用 unicode 编码,再使用 unicode 解码,得到:a
'、'使用 unicode 编码,每个字节对应的数字为:1,48
'、'使用 unicode 编码,再使用 unicode 解码,得到:、
'中'使用 unicode 编码,每个字节对应的数字为:45,78
'中'使用 unicode 编码,再使用 unicode 解码,得到:中
'a'使用 utf-8 编码,每个字节对应的数字为:97
'a'使用 utf-8 编码,再使用 utf-8 解码,得到:a
'、'使用 utf-8 编码,每个字节对应的数字为:227,128,129
'、'使用 utf-8 编码,再使用 utf-8 解码,得到:、
'中'使用 utf-8 编码,每个字节对应的数字为:228,184,173
'中'使用 utf-8 编码,再使用 utf-8 解码,得到:中
'a'使用 utf-16 编码,每个字节对应的数字为:97,0
'a'使用 utf-16 编码,再使用 utf-16 解码,得到:a
'、'使用 utf-16 编码,每个字节对应的数字为:1,48
'、'使用 utf-16 编码,再使用 utf-16 解码,得到:、
'中'使用 utf-16 编码,每个字节对应的数字为:45,78
'中'使用 utf-16 编码,再使用 utf-16 解码,得到:中
'a'使用 utf-32 编码,每个字节对应的数字为:97,0,0,0
'a'使用 utf-32 编码,再使用 utf-32 解码,得到:a
'、'使用 utf-32 编码,每个字节对应的数字为:1,48,0,0
'、'使用 utf-32 编码,再使用 utf-32 解码,得到:、
'中'使用 utf-32 编码,每个字节对应的数字为:45,78,0,0
'中'使用 utf-32 编码,再使用 utf-32 解码,得到:中
其他内容
1、如果上面用将byte转化为数字觉得不直观,也可以用下面的代码转化为二进制来看。
private static string ConvertToBinaryString(byte[] bytes)
{
return string.Join(",", bytes.Select(c => $"{c / 128}{c % 128 / 64}{c % 128 % 64 / 32}{c % 128 % 64 % 32 / 16}{c % 128 % 64 % 32 % 16 / 8}{c % 128 % 64 % 32 % 16 % 8 / 4}{c % 128 % 64 % 32 % 16 % 8 % 4 / 2}{c % 128 % 64 % 32 % 16 % 8 % 4 % 2}"));
}
将Byte[]转化为二进制字符串
2、c#中的数字类型设计
数字的存储方式有两种,大端和小端,C#使用小端,如果跨语言交互,需要考虑转换。
具体见百度百科:
c# 基本类型存储方式的研究的更多相关文章
- C语言中float,double类型,在内存中的结构(存储方式)
C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...
- Android的资源类型和存储方式简介-android学习之旅(五十二)
android资源的类型 android资源的存储方式
- float和double类型的存储方式
Float double 类型在计算机的存储方式 计算机中只认识10的二进制数,那么该如何存储小数呢? 那么我们先看Floa类型: Float在计算机(32位)中是4个字节的,具体地:第一位为符号位0 ...
- 二进制、十六进制理解及int类型二进制存储方式
二进制 0000 0000 0000 0000 0000 0000 0000 0001 // 2^0 0000 0000 0000 0000 0000 0000 0000 0010 // 2^1 00 ...
- iOS学习——iOS常用的存储方式
不管是在iOS还是Android开发过程中,我们都经常性地需要存储一些状态和数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.根据要存储的的数据的大小.存储性质以及存储类型,在iOS和An ...
- .NET C#教程初级篇 1-1 基本数据类型及其存储方式
.NET C# 教程初级篇 1-1 基本数据类型及其存储方式 全文目录 (博客园).NET Core Guide (Github).NET Core Guide 本节内容是对于C#基础类型的存储方式以 ...
- 前端HTML5几种存储方式的总结
接下来要好好总结一些知识,秋招来啦...虽然有好多知识都不大会,但是还是要努力一下,运气这种东西,谁知道呢~ 总体情况 h5之前,存储主要是用cookies.cookies缺点有在请求头上带着数据,大 ...
- android存储方式的应用场景
作为一个完整的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.文件存储.SQLite. Content Provider ...
- iOS开发系列--C语言之存储方式和作用域
概述 基本上每种语言都要讨论这个话题,C语言也不例外,因为只有你完全了解每个变量或函数存储方式.作用范围和销毁时间才可能正确的使用这门语言.今天将着重介绍C语言中变量作用范围.存储方式.生命周期.作用 ...
随机推荐
- Linux下virtualenv与virtualenvwrapper详解
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...
- Alpha2版本-组织管理、党员管理、活动管理测试
小程序组织管理.党员管理.活动管理测试-测试报告 一.测试工具的选择 微信安卓版v7.0.8 微擎工具v1.7.0 PHPstorm Google Chrome 76.0.3623 二.测试用例 ...
- 目标检测论文解读3——Fast R-CNN
背景 deep ConvNet兴起,VGG16应用在图像分类任务上表现良好,本文用VGG16来解决检测任务.SPP NET存在CNN层不能fine tuning的缺点,且之前的方法训练都是分为多个阶段 ...
- 201871010121 王方 《面向对象程序设计(java)》 第二周学习总结
这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11475 ...
- MySQL体系结构与存储引擎
MySQL 体系结构 先看 MySQL 数据库的体系结构,如下图所示. MySQL 体系结构由 Client Connectors 层.MySQL Server 层及存储引擎层组成. Client C ...
- USACO Superprime Rib
洛谷 P1218 [USACO1.5]特殊的质数肋骨 Superprime Rib 洛谷传送门 JDOJ 1673: Superprime Rib JDOJ传送门 题目描述 农民约翰的母牛总是产生最好 ...
- Scheme、Claim、ClaimsIdentity、ClaimsPrincipal介绍
在 token 创建.校验的整个生命周期中,都涉及到了 Scheme.Claim.ClaimsIdentity.ClaimsPrincipal 这些概念,如果你之前有使用过微软的 Identity ...
- 爬虫之selenium模块chrome版本映射表
驱动及版本对应关系如下: 驱动下载路径见底部: chromedriver版本 支持的Chrome版本v2.43 v69-71v2.42 v68-70v2.41 v67-69v2.40 v66-68v2 ...
- 洛谷 p2055 假期的宿舍 题解
好长时间没更博客了 因为实在太蒻了 这让本蒟蒻怎么办 今天终于遇到了一道模板题(之前也有,不过太蒻了都不会) 不过...写代码5分钟,调试2小时 分界线:回归正题 这个就是普通的匈牙利算法 差不多 思 ...
- 专题-主存储器与Cache的地址映射方式
2019/05/02 10:23 首先,我们注意到地址映射有三种:分别是直接地址映射.全相联映射.组相联映射. 首先我们搞清楚主存地址还有Cache地址的关系,还有组内地址的关系,常见我们的块内地址, ...