首先我们要知道,数据的大小是有什么决定的
答案是其数据类型所拥有的的内存空间
当我们知道了其数据类型,
如:
int 占4byte
char 占 1byte
此时因为他们所拥有的内存空间也就使他们的二进制位就有分别
int 32bit
char 8bit
而一个bit的大小可以放一个二进制
所以他们的最大值可能就是(此处看成无符号的):
int 1111 1111 1111 1111 1111 1111 1111 1111(4,294,967,168)
char 同理 1111 1111 (255)
而最小值为
0000 0000 0000 0000 0000 0000 0000 0000
当我们考虑上符号位(二进制的第一位)时:
他们的最大最小值就会发生改变(此处就直接那char举例、int 同理推理):
char的取值的所以可能性:
0000 0000
0000 0001
.....
0111 1110
0111 1111(此处已经是char类型的最大正数了127)
在加上1就为
1000 0000 (-128)此处是一个固定的值,当char中出现该数就会直接看成-128
1000 0001(-127)此处存的是补码先将其转化成原码1111 1110 、1 111 1111(-127)
注意:这里要区分与printf打印处的区别(先提升再看是否要转变blog)
.....
1111 1110
1111 1111 通过补码转化成原码 1000 0001 也就是 -1
所以通过上面我们就可以得出在
有符号的char类型的取值范围:
signed char(大部分编译器的char) : -128 ~ 127
unsigned char :0 ~ 255
共有256个
附:
如何通过给你一个有符号的char(用于负数,正数没必要)在而判断出他无符号的char的数值,
如:当给你-128要你转化成正数是多少:
那就可以通过
256 + 这个数
256 + (-128) = 128
同理
- 92 :此时就为 256 - 92 = 168
反之若要你通过正数找负数那就用 256 - 正数
256 - 168 = 92
下面这张图就能更好的去记忆char类型的范围
有符号的char当数字大于127后就会变成-128,再当数字大于-1,就会变回0
无符号的char当数字大于127.... 129 ... 255 .. 0
如此循环,无法超越范围
当然short , int ...等都是相同的