0基础学C++:整数类型

本文介绍了C++中整数类型的取值范围,以房间比喻解释了不同字节数对存储的影响。从1字节到4字节的整数,分别能表示-128到+127、-32768到+32767、-2147483648到+2147483647的整数。文章还讨论了原码、反码和补码的概念,并解释了为何使用补码表示整数的原因。此外,提到了long long类型的引入及其在不同编译器中的支持情况。最后,文章提醒读者关注整数溢出问题,并提供了防止溢出的方法。
摘要由CSDN通过智能技术生成

慕课武汉大学戴光明、马钊老师的课程《零基础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中不同的数据类型:

  1. int a: a 4个字节)
  2. short b; b(2个字节)
  3. long c; c(4个字节)
  4. long long ago; ago(8个字节)

注意:到底用哪一种取决于取值范围的需求,用好整数的关键就是“关心它的取值范围”;
//随着编译器的不同,字节数会有所变化,
当我们换了其他编译器后,可以用运算符sizeof(变量名或类型名)来查看字节数;


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值