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语言中变量作用范围.存储方式.生命周期.作用 ...
随机推荐
- Django框架(一)-- Django简介
django(Python Web框架) Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗 ...
- TP框架命令行操作
cmd进入到tp项目根目录 php think route:list #查看以定义路由 php think version #框架版本 php think list #指令列表 php think h ...
- rhel7学习第五天
管道命令符的功能的确强大!
- [转]【Servlet】Servlet的访问过程
创建时间:6.15 Servlet的访问过程 1. 画图描述整个访问过程: *每次访问service()方法都会创建一对新的request和response对象,都不一样 2. 访问过程2: 问题:对 ...
- The run destination "设备名称" is not valid for Running the scheme '项目名称'.
之前运行好好的,怎么会突然出现这个呢?开始百度发现都解决不了. 最后发现,这是XCode的一个bug.遇到这种情况只要Command+Q,退去XCode,然后再重新登入即可.
- java.util.ConcurrentModificationException异常;java.util.ConcurrentModificationException实战
写代码遇到这个问题,很多博客文章都是在反复的强调理论,而没有对应的实例,所以这里从实例出发,后研究理论: 一.错误产生情况 1 .字符型 (1)添加 public static void main(S ...
- 小人大作战v0.02原型(单机)发布
运行环境,pc,windows 链接:https://pan.baidu.com/s/1X5XR0flRAVuinnydNyRNng 提取码:cp9q 复制这段内容后打开百度网盘手机App,操作更方便 ...
- python接口自动化框架
接口测框架 安装教程 需要3.5及以上版本的python pip install -r requirements.txt 使用说明 运行manage.py创建项目 创建的项目在projects目录下 ...
- SpringMVC的乱码问题
1:表单提交controller获得中文参数后乱码解决方案 注意: jsp页面编码设置为UTF-8 form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果 <%@ p ...
- Educational Codeforces Round 78 (Rated for Div. 2) D. Segment Tree
链接: https://codeforces.com/contest/1278/problem/D 题意: As the name of the task implies, you are asked ...