int是指Integer(整数)
32位有符号整数种,最高位用于存放符号,那么存放数据的bit有31个
那么int类型最大可以表示231-1即2147483647
注意,在程序中计数最小值是所有bit全0的状态,也就是最小是0(无符号情况下)
最大值是1+2+22+23+24+25+…+2n-1=2n-1
后续内容中也请注意,出现计数内容都是从0开始计数
对于每一个数值类型,都可以.MaxValue获取最大精准值,用.MinValue获取最小精准值
Console.WriteLine(int.MaxValue);
Console.WriteLine(int.MinValue);
备注
2,8,16进制数
声明一个2进制数的方式是在数前面加0b
8是加0,16是加0x
double b=0xa6;
Console.WriteLine(b);
无符号整型
数值类型的最高位用于储存符号,所以用来记非负数就浪费了一位
为此,可以了解一下不储存符号的整型
ushort
uint
ulong
他们和原版的区别在于前面加了u(unsigned无符号)
byte原本就是无符号的,他的变体是sbyte(s是unsigned,符号)
写一个无符号的数值的方式是在后面加个u
数值也有类型,虽然你可以直接用12给uint赋值
各类型数据范围
类型 | 最小 | 最大 |
---|---|---|
byte | 0 | 255 |
short | -32768 | 32767 |
int | -2147483648 | 2147483647 |
long | -9223372036854775808 | 9223372036854775807 |
无符号类型的最小值是0,最大值是原版的2倍+1
支线任务
补码
你可能会好奇,为什么负数的表示范围比整数多1
因为0是不需要符号的,+0和-0表示的是同一个数
可是,我们用正数比较多,为什么不是正数范围比负数多1?
这个问题需要解释补码这个概念
首先你需要知道一个问题,就是cpu只能算加法
那么cpu要怎么算减法呢?
如果一个钟快了20分钟,想较准有两种方法
一是往后调20分钟
二是再调快11小时40分钟
对,既然各数值都有一个范围,这个范围也是它的周期
那么只要越过周期跨一个轮回能算减法了
所以当你开修改器将某个数值改的超大的时候
在加一点数值就会变成一个非常负的数值
因为你碰到他的界限,从0开始了
补码的负数表示
为什么补码周期的开始是非常负的负数而不是0呢
我用5bit的数据演示一下
01010,这是+10
11111,这是-1
两个数加起来,如果是2就往前面进位
101001,现在他是6bit了,把溢出的那个1丢掉
01001,+9
一个越接近临界值的数,表示的负数就越小(绝对值)
因为相加溢出后原本正数补偿临界的数就越小,减少的也就越小
而且这种表示方法还有一个好处
符号位并不是单独提出来算他们的绝对值然后再放回去的
而是一起参与了加法
而且你就知道了为什么游戏中和c#中数值溢出不会报错
因为计算减法本身就需要数据溢出