慕课武汉大学戴光明、马钊老师的课程《零基础C语言》,边听边学边做笔记。
把123放入a房间,把456放入b房间,这样是不行的
十进制是给人看的,计算机只能识别二进制
假如用一个字节来放整数?
0 0 0 0 0 0 0 0 → 1 1 1 1 1 1 1 1
二进制房间到底有多大?
要存储一个0,计算机要拉开房间抽屉,放8个0进去
一个字节是8位,我们意味着最小可以在里边放8个0,最大可以在里边放8个1
2的8次方=256 取值范围:0~255(为什么是255呢?因为2的8次方是256,我们从0开始计算,所以要减去
整数有正负数,所以,我们在存储中,是把最高位拿出来表达正数和负数,第一位叫符号位
“+ 0 -------”最高位符号位为0表示正整数
“- 1-------”最高位符号位为1表示负整数
所以,真正用来存储的是后7位,也就是2的7次方=128,取值范围为:-128—+127
加大“房间”:假如用2个字节来存放整数,依然最高位为符号位
“+ 0---------------”,符号位为0表示正整数
“- 1---------------”,符号位为1表示负整数
2的15次方=32768,取值范围就变成了-32768—+32767
假如4个字节来存储
就有31位数值位,2的31次方=2147483648,取值范围:-2147483648—+2147483647
一个整型房间,VC到底怎么处理呢?
这个房间到底有多大?答案:4个字节。4个字节就是32位
所以:int a=1
变量a=1存放示意图
00000000 00000000 00000000 00000001
计算机存放整数的时候,使用补码的形式来存放,
正数的补码就是其本身,
负数的补码:①保留符号位不变;②剩下位求反再加1;
扩展:原码 反码 补码
转自张子秋博客
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式.
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.
为什么要用补码?
①符号位参与运算;
②简化电路设计;
③消除-0
所以int的取值范围:-2147483648~2147483647,即2的31次方—(2的31次方-1);
如果需要更大值,可以继续把房间加大 !
这一切的考虑,均来源于对整数取值范围的需求。
类型 | 字节数 | 取值范围 |
---|---|---|
int(基本整型) | 4 | -2147483648~2147483647(2的31次方-1) |
short(短整型) | 2 | -32768~32767(2的15次方-1) |
long(长整型) | 4 | -2147483648~2147483647(2的31次方-1) |
long long(双长整型) | 8 | -9223372036854775808~922372036854775807(2的63次方-1) |
unsigned int(无符号基本整型) | 4 | 0~2147483647(2的32次方-1) |
unsigned short(无符号短整型) | 2 | 0~65535(2的16次方-1) |
unsigned long(无符号长整型) | 4 | 0-4294967295(2的32次方-1) |
unsigned long long(无符号双长整型) | 8 | 0-18446744073709551615(2的64次方-1) |
这是一个买一送一,有4个符号型,再送4个unsigned 无符号型,最高位被用作数值位,因此笔对应的signed型取值范围,正方向向上“翻倍”。
为什么要用长整型的数呢?
我们最早的操作系统是16位的,如Dos,使用的是2个字节的短整型,我们现在的32和64位操作系统。
由上可知,我们至少可以定义4中不同的数据类型:
- int a: a 4个字节)
- short b; b(2个字节)
- long c; c(4个字节)
- long long ago; ago(8个字节)
注意:到底用哪一种取决于取值范围的需求,用好整数的关键就是“关心它的取值范围”;
//随着编译器的不同,字节数会有所变化,
当我们换了其他编译器后,可以用运算符sizeof(变量名或类型名)来查看字节数;