搜索
首页 电脑/网络 程序设计 C/C++

C语言基本整型的数据范围什么意思

书上写:基本整型变量所占字节数为2数据范围是-32768----32767可是一个数字占字节数就为1字节如果存32767不是占了5个字节了么?为什么数据范围是-32768----32767?????想了很久没想通。。。

全部回答

2018-08-01

37 0
    1字节=8位int型2字节=16位按VC 和C 的规定,int和long等长,都是32位的。short才是16位的。只有原始的C才定义int和short等长为16位。
  这个数据范围指的确实是具体int的取值范围,但不是你理解的那样。现在以16位的short为例。  首先必须清楚一个概念,计算机中存放的数据都是以二进制形式存放的。short存放的是整型数据,是用固定位数16个二进制位来表示一个整数,不足16位补0。
  比如125的二进制是1111101,那么在内存中存放就是0000000001111101那么16个二进制位能够表示多少种不同的整数呢?稍微用点数学常识就知道,是2的16次方,也就是65536个不同的整数。
    所以对于无符号整数,unsignedshort的范围就是0~65535。而为了表示负数,计算机用short的第一位作为符号位来表示正负。注意,计算机中是以补码的形式存放整数的。
  对于正数,补码是其本身;对于负数,其补码是对其绝对值的按位取反,再加1的结果。举个简单的例子:125是0000000001111101-125计算过程:125是0000000001111101按位取反,1111111110000010再加1,1111111110000011所以-125就是1111111110000011。
    补码不是三言两语能讲得清楚的,楼主有个概念即可。我们发现,正数的补码首位都是0,负数的补码首位都是1。short有符号型的范围是-32768~32767。那么,如果超出了范围,会发生什么现象呢?很简单,这称为溢出。
  比如shorta=3276832768是1000000000000000。  还记得我讲过吗?正数的补码首位都是0,但这里首位为1,这是怎么回事呢?其实因为浪费了1位做符号位,short的有效位数只是15位而已,而2的15次方是32768,因此正数的范围是0~32767,32768超出了范围,计算机怎么处理呢?结果就是把它当作负数,根据补码计算它的原码。
    反过来即可1000000000000000减1,0111111111111111再按位取反,1000000000000000就是32768所以1000000000000000表示-32768也就是说shorta=32768;把a输出来得到-32768楼主可以试验一下。
    再举一例:unsignedshorta=65536;65536是10000000000000000注意这已经是17位了。计算机会自动截取后面的16位就是得到0000000000000000,也就是0所以unsignedshorta=65536;输出a得到0。
  明白了吗?。  。

类似问题换一批

热点推荐

热度TOP

相关推荐
加载中...

热点搜索 换一换

电脑/网络
C/C++
硬件
电脑装机
程序设计
互联网
操作系统/系统故障
笔记本电脑
反病毒
百度
软件
程序设计
C/C++
VB
数据库
汇编语言
JAVA相关
VC++
C#/.NET
其他编程语言
C/C++
C/C++
举报
举报原因(必选):
取消确定举报