C#基础知识
一、常用单位转换
每一个二进制位称为一个比特位bit
8bit => 1byte
1024byte => 1KB
1024KB => 1MB
1024MB => 1GB
1024GB => 1TB
1024TB =>1PB
1024PB =>1EB
二、负数表示
通常把一个二进制的最左边一位叫做最高位,如果需要表示负数则最高位是符号位,不表示一个数值大小,只表示数值正负性。0为正,1为负。为了计算负数引入了原反码补码的概念。
原码
原码:直接由其他进制计算过来的得到的结果
反码
反码:符号位不变,其他位按位取反
补码
补码=反码+1
1.以上的规则只针对负数,正数的原码反码补码都一样。
2.所有的数据在计算机中存储与运算都是以补码的形式进行的。
3.如果计算的结果有溢出的情况,则溢出位全部舍去。
4.由负数的补码求原码:对计算出的数值再求一次补码。
!!!取值范围
无符号的八位二进制数的表示范围:[0~255]
有符号的八位二进制数的表示范围:[-128~127]
即:[2^(位数-1) ~ 2^(位数-1)-1]
0111 1111 ——> 127
1111 1111 ——> -1
1111 1110 ——> -2
1000 0001 ——> -127
1000 0000 ——> -0(-128)
0000 0000 ——> +0
因为有两个二进制数都表示0 因此规定:1000 0000 ——> -128
三、c#数据类型
1.基本数据类型
a、整型
默认值:0
- 有符号整型(八位二进制中第一位表示正负其余七位表示数值)
字节型 ——> sbyte ——> 1byte ——> [-128~127]
短整型 ——> short ——> 2byte ——> [2^(位数-1) ~ 2^(位数-1)-1]
整型 ——> int ——> 4byte ——> [2^(位数-1) ~ 2^(位数-1)-1]
长整型 ——> long ——> 8byte ——> [2^(位数-1) ~ 2^(位数-1)-1] - 无符号整型(八位二进制中各位数只表示数值不表示正负)
字节型 ——> byte ——> 1byte ——> [0~255]
短整型 ——> ushort ——> 2byte ——> [0~2^(位数-1)]
整型 ——> uint ——> 4byte ——> [0~2^(位数-1)]
长整型 ——> ulong ——> 8byte ——> [0~2^(位数-1)]
b、浮点型
默认值:0.0(与整型的区别在于加了小数点)
在计算机中用科学计数法存储。eg:12.3 X 10 ^ 5 == 12.3e5 (e表示X10^)
- 单精度 ——> float ——>4byte ——> 3.14f(float需要在数字后面加f或者F)
- 双精度 ——> double ——>8byte ——> 3.14d(double需要在数字后面加d或者D,也可以不加)
- 高精度 ——> decimal ——>16byte ——> 3.14m(decimal需要在数字后面加m或者M)
c、布尔型
默认值:false
布尔型 ——> bool ——> 1byte ——> [true,false]
d、字符型
默认值:用’\u0’或是’\u000’来表示(一般来说表示的意义是一个空格,然而不同的终端显示的以不同,也有可能是一个口)
结果应该为一个空格(’\0’),但有时结果会为a,这是因为控制台字体的影响
有可能在某种字体中显示’\0’时候就是a那种样子,那么就可以解释的通了
字符型 ——> char ——> 2byte
1、任何的字符在计算机底层存储中都是采用一个数字来存储的
2、一个字符到底要用什么样的数字来存储,由字符集(如Ascll码、Unicode码等)来决定。
3、一个字符和一个整型的数据是相通的,是可以相互转换的。
字符 ——> 整型:c + 1
整型 ——> 字符:(char)(c + 1)
eg:
//占用字符长度为1的符号,单引号赋值,只能赋值一个字符,并且不能为空。
char c = 'a';
Console.WriteLine(c);//结果为:a
Console.WriteLine(c+1);//结果为:98
char d= '张';
Console.WriteLine(d);//结果为:张
Console.WriteLine((char)(d+ 1));//结果为:弡(jue)
//自动类型转换
int a = 'a';
//强制类型转换
char a = (char)97;
2.引用数据类型
引用数据类型的默认值为NULL。(表示空 表示没有值,连地址都没有)
利用堆栈解释引用类型:
int[] array = {1, 2, 3, 4, 5 }; 等价于 int[] array = new int[5]{1, 2, 3, 4, 5 };
1、除了结构体外,其他的new都是在堆中开辟空间的
2、数组在堆中的第一个元素的地址是随机的,但是之后的元素地址都是连续的
数组array中有五个元素,在堆上开辟了5个连续的4字节空间(如下图),每个空间都有相对应的地址(int数据类型,一个数据占四字节,因此开辟4字节空间)。
其中0x1234是数组的首元素地址,当Main方法执行时被压入栈中,Main方法中声明了Array数组。此时打印数组Console.WruteLine(array)发现,打印出来的结果并不是元素,而是System.Int32[]。原因是c#语言中不显示地址,而原本应该显示的是地址才对,所以结果变成了数组元素的数据类型。
因此我们可以知道在Array数组中存储的不是元素而是数组中首元素在堆上的地址,所以在Main方法中Array称作是堆上数组的引用。因此是引用数据类型。
static void main(String[] args){
int[] Array = {
1, 2 , 3, 4, 5 };
Console.WriteLine(Array);//结果为Syetem.Int32[]
}
2.1 字符串
字符串:一个系列字符组成的一个有序序列,是一个引用数据类型,关键字String,一个字符串需要用双引号引起来。
//字符串可以长度为0
string name = "qwere";
Console.WriteLine(name);//结果为:qwere
字符串拼接
字符串连接运算符“+” :当“+”前后有任意一个是字符串时,此时“+”被当做是连接运算符
//字符串拼接
String a = "hello";
String b = "world";
String c = a + b;
Console.WriteLine(c);//结果为:helloworld
//字符串连接运算符+ :当+前后有任意一个是字符串时,此时+被当做是连接运算符
Console.WriteLine("hello"+1);//结果为hello1
Console.WriteLine(1+"hello");//结果为:1hello
Console.WriteLine(1+2+3+"hello");//结果为6hello
Console.WriteLine(1+2+3+"hello"+3+2+1);//结果为:6hello321,原因如下:
/*
* 1、符号都为+时算同级运算,因此从前往后1+2+3被当做算术运算符执行得到6;
* 2、第三个+后面是字符串所以被当做字符串连接符执行,得到6hello;
* 3、后面的3+2+1在执行时,因为前面已经是字符串了,所以此时也由整型转换成了字符串,因此得到6hello321
*/
解析字符串变量
符号 $ :在字符串前方加一个$,表示解析字符串中的变量,字符串中的变量用{}括起来即可。
//符号$:在字符串前方加一个$,表示解析字符串中的变量,字符串中的变量用{}括起来即可。
int meter = 1;
String str = $"小明跑了{meter}米";
Console.WriteLine(str);//结果为:小明跑了1米
字符串原意输出
符号@:原意输出,不需要进行转义即不加转义字符“\”(弊端:@“”中不能再出现双引号了)
//C:\"Program Files(x86)"\
//通常的转义字符\:在C:\"Program Files(x86)"\字符串中第一个需要转义的从左到右分别是 :\ " " \ 这5个符号。
String path = "C:\\\"Program Files(x86)\"\\";
Console.WriteLine(path);
//符号@
String Path = @"C:\Program Files(x86)\";
Console.WriteLine(Path);
输出字符串语句
//输出语句用法
//Console.WriteLine();将括号中的内容输出到控制台,并且换行
//Console.Write();将括号中的内容输出到控制台,并且不换行
//输出语句小明跑了1米;三种写法:
float time = 2;
//第一种
Console.WriteLine("小明跑了"+meter+&