取值范围
目录:
一、比特位
二、进制
三、符号位
四、补码
五、基本数据数据类型的取值范围
一、比特位
CPU能读懂的最小单位-比特位,称之为bit,也叫b。
内存机构的最小寻址单位-字节,叫Byte,我们用大写的B来表示。1Byte=8小bit,一个字节有8Byte表示。
二、进制
//在上图的进制表中可以得知:无论是二进制,十进制还是十六进制他们的前两行的值都是
//相等的,都是0和1,十进制就是满十进一。十六进制也是同样的算法,从0到F,满十//六进一。其中ABCDEF分别表示10,11,12,13,14,15。进制间的转化可以使用8421法。
/**
*cpu能读懂的最小单位-比特位,bit,b;理论上讲,内存机构的最小寻址单位-字节,
*byte,B。经过漫长的使用,人们慢慢的将1Byte=8bit给定了下来了。且每个比特位只能存
*二进制数,也就是0和1。这里有一个问题:一个字节最大可以存放的数用二进制该如何
*来表示?答案是用8个1表示即可,如下图所示:
*登入bbs.fishc.com/forum-329-1.html网址,进行扩展阅读。
*学员们可以通过观看扩展阅读,来了解使用补码的好处。
*之所以要进行扩展阅读,是因为学习不能只有一个听的过程,还需
*一个思考的过程,扩展阅读可以帮助学员们更深刻的理解这些知识*点,扩展阅读具有图文并茂的特点。
*练习:定义一个整型变量,使用pow函数计算出2的32次方的值
*#include <stdio.h>#include <math.h>
*int main()
*{
*int result = pow(2,32)-1;
*printf ( "result = %d \n" , result);
*return 0;
*下面需要使用理念lm选项,因为需要使用对应的库
*$ vi test1.c
*$ gcc -lm testl.c &&./a. out
*打印结果如下:
Testl.c:In function main
Testl.c:6: warning overflow in implicit constant conversionresult=2147483647
*存在的问题是常量溢出,其中警告程序可以正常执行,但是报错就
*不行了。
*经过计算器的验算,可以发现编译器执行的结果并不正确。
*之所以会出现这种情况,是因为没有注意到符号位的使用。符号位:
*存放signed类型的存储单元中,左边第一位表示符号位。如果该位
*为0,表示该整数是一个正数;如果该位为1,表示该整数是一个负数。
*正确的做法是在int的左边加上unsigned,便解决了符号位的问题:
*修改好的代码如下图所示(加上的代码已经使用红色标记):
*#include <stdio.h>#include <math.h>
*int main()
*{
*unsigned int result = pow(2,32)-1;
*printf ( "result = %d \n" , result);
*return 0;
*新需求:带符号位的最大的可以存储多大的值?
*分析过程如下:
*一个32位的整型变量,除去左边第一位符号位,剩下表示值的只有31
*个比特位。因此,一个int类型的数据类型最大可以存放2^31-1的
*数。
*事实上,计算机是通过补码的形式来存放整数的值的。
**/
三、符号位
- 存放signed类型的存储单元中,左边第一位表符号位。如果该位为0,表示该整数是一个正数如果该位为1,表示该整数是一个负数。
- 一个32位的整型变量,除去左边第一位符号位,剩下表示值的只有31个比特位。
事实上计算机是用补码的形式来存放整数的值。
四、补码
- 正数的补码是该数的二进制形式。
- 负数的补码需要通过以下几步获得:
1.先取得该数的绝对值的二进制形式
2.再将第1步的值按位取反
//按位取反是指将0变成1,将1变成0即可。
/**
*一个使用二进制存储的整数7:
*首先取他的绝对值的负数-7
*进行变换后(符号位不变,其他位按位取反)的结果如下图:
*最后一步,末尾加一,便得到了补码:
**/
3.最后将第2步的值加1
/**
*最大值为:
*最小值为:
*这里有一个小细节,为什么最大值是127而最小值却是-128呢?
*原因就在于正数比负数多了一个0.
五、基本数据数据类型的取值范围
/**
*例如char类型所占的字节数1个字节,取值范围是-128~127,而
*unsigned char则是没有负数,也就是将负数的绝对值加到了正数*部分上去,所以unsigned char的取值范围是0~255。
Short类型
*占用两个字节的内存,取值范围是-32768~32767,也就是-2^15
*到2^15。同理可得,unsigned short类型的取值范围也是将负数
*部分的值加到正数上去,也就是0~65535.以此类推,下面的int,
*long类型也都是同样的道理。