C语言中的不同类型的取值范围

前言

C语言中,我们知道最基本的数据类型有int整型,floatdouble浮点型,char字符型,在计算机里,他们的取值并不是任意和无限的,都有相应的取值范围,那么计算机是如何存储和计算的呢,接下来为大家分析和讲解。

一、进制知识

首先我们来了解下进制,我们平时说的数字和计算都是按照十进制来进行的,从0 ~ 9,逢10就进1,称为十进制。计算机中存储的数据都是二进制,从0 ~ 1,逢2就进1,还有类似的八进制,而十六进制则是0 1 2 3 4 5 6 7 8 9 A B C D E F 这16个数组成。

    int num = 0b101101;//前面加0b表示二进制printf("十进制 %d\n",num);printf("八进制 %o\n",num);printf("十六进制 %x\n",num);

打印结果:

十进制是 45
八进制是 55
十六进制是 2d

二、计算机的内存知识

计算机的只能存储和识别二进制数,内存相当于由很多个格子组成,每个格子里存储的是0或1,每个格子我们叫做一个二进制位,英文用bit表示,8个二进制位分为一组,叫做一个字节,英文用byte表示,数量关系如下:
8 bit = 1 byte,
1024 byte = 1 KB,
1024 KB = 1 MB,
1024 MB = 1 GB,
1024 GB = 1 TB

数据在内存的存储方式:

1 0 1 0 1 1 0 1
0 0 1 1 0 0 1 0

三、 原码,反码,补码

一个整型数据,如果不考虑正负,一个十进制数的原码就是它的二进制形式,如果有正负,最高位(左边数起第一位)作为符号位,0表示正数,1表示负数,剩下的位数,就是这个数绝对值的二进制形式。C语言中的数据默认是有正负的。

正数的反码就是其原码,负数的反码是符号位不变,其他位取反。正数的补码就是其原码,负数的补码是反码+1。

一个十进制数11,假设用一个字节存储,原码,反码,补码表示如下:

原码 0 0 0 0 1 0 1 1
反码 0 0 0 0 1 0 1 1
补码 0 0 0 0 1 0 1 1

一个十进制数-13,假设用一个字节存储,原码,反码,补码表示如下:

原码 1 0 0 0 1 1 0 1
反码 1 1 1 1 0 0 1 0
补码 1 1 1 1 0 0 1 1

C语言中,任何数据都是以补码的形式存储在内存当中,为什么呢,计算机中只有加法没有减法,用补码做运算效率是最高的,我们举个简单的例子,5的原码是0000 0101,-5的原码是1000 0101,补码是 1111 1011,如果要计算加法 5 + -5 ,原码相加结果为 1000 1010 ,转换为十进制等于-10,如果补码相加,结果为 0000 0000,转换为十进制等于0,所以计算机中的数据都是以补码的形式储存。

四、 数据的取值范围

一般的,C语言中,int类型数据占4个字节,float类型占4个字节,double类型占8个字节,char类型占1个字节,不同的编译器给变量分配的字节数不同,可以使用sizeof(类型)函数来获得类型占据的字节数。

接下来以char类型为例,讲解它的取值范围,char占据1个字节8个二进制位,当无符号时,最小为0,最大的数值是 1111 1111,转换为十进制是28-1=255,当有符号时,最高位表示符号,最大是0111 1111,转换为十进制是27-1=127,注意,这时我们会推理,最小值应该是1111 1111,十进制是-127,然而并不是,有符号字符型char的最小值是-128,在内存中以补码1000 0000的形式储存,-128这个数它没有原码,也没有反码,只有补码,如果按照原码转补码的计算方法逆推-128的原码,1000 0000 减 1 后-128的符号位就会由1变为0,不再是负数,所以-128只有补码 1000 0000,没有原码和反码,-127的原码是 1111 1111,补码是 1000 0001,-128的补码由-127的补码减1得到。综上,有符号字符型char的取值范围是是 -128~127 即 -27~(27-1)。

按照以上的推理方法,我们可以推断出int类型的取值范围。至于浮点型float和double的储存会比较复杂,float类型占4个字节,在存储时,系统将实型数据分成小数部分和指数部分两个部分,分别存放,小数部分小数点前面的数为0。以3.14159为例:+ 0.313159 x 101

数符 小数部分 指数
+ . 3 1 4 1 5 9 1

实际上在计算机中是用二进制数来表示小数部分以及用2的幂次来表示指数部分,在4个字节中,究竟用多少位来表示小数部分,多少位来表示指数部分,不同的编译器并不相同,有的编译系统以24位表示小数部分(包括符号),以8位表示指数部分。

由于二进制形式表示一个实数以及存储单元的长度是有限的,因此不可能得到完全精确的值,只能存储成有限的精度,float类型的有效数字是6位,数值范围是 -3.4x1038~ 3.4x1038

C语言中基本类型的取值范围

类型 字节数 取值范围
int(有符号) 4 -231 ~ (231-1)
int(无符号) 4 0 ~ (232-1)
char(有符号) 1 -27 ~ (27-1)
char(无符号) 1 0 ~ (28-1)
float 4 0以及1.2x10-38~3.4x1038(绝对值)
double 8 0以及2.3x10-308~1.7x10308(绝对值)

C语言中不同类型的取值范围相关推荐

  1. Java基础题37:(单选题)java中char类型的取值范围是() A.0 ... 32767 B.0 ... 65535

    37.(单选题)java中char类型的取值范围是() A.0 - 32767 B.0 - 65535 C.–256 - 255 D.–32768 - 32767 [正确答案]B [答案解析]在jav ...

  2. 为什么Java中float类型的取值范围大于long类型

    在学习Java的过程中,我遇到了一个很有意思的问题,就是为什么Java中float类型的取值范围会大于long类型. 类型名 大小/字节 取值范围 float 4(32bit) -3.4E+38 ~ ...

  3. Java中byte类型的取值范围

    取值范围为-128~127 1.为什么是[-128,127]   计算机中存储最大的应该是0111 1111,第一位是符号位,所以表示最大的数值:127   存储的1 1111111应该是最小的数值: ...

  4. java byte 正数最大_关于JAVA中Byte类型的取值范围的推论(*零为正数,-128在计算机中的表示方法...)...

    先看一段推理 +124:0111 1100 -124:1000 0100 +125:0111 1101 -125:1000 0011 +126:0111 1110 -126:1000 0010 +12 ...

  5. python中long类型的取值范围_java基本数据类型取值范围

    在JAVA中一共有八种基本数据类型,他们分别是:byte.short.int.long.float.double.char.boolean 整型 其中byte.short.int.long都是表示整数 ...

  6. 关于java中int类型的取值范围等问题

    java中int类型取值范围问题 java中int的类型占4个字节,与操作系统无关,要弄明白int的取值范围问题. 首先,我们来看一下byte的取值范围 byte 大小一个字节. 如:1111 111 ...

  7. 为何 java 中 int 类型的取值范围是 [-2147483648, 2147483647]

    在 jdk 源代码时, 在 Integer 包装类中,可以看到定义了两个静态变量 /*** A constant holding the minimum value an {@code int} ca ...

  8. mysql int 正数 范围_mysql中整数字段不同类型的取值范围

    mysql数据库设计,其中,对于数据性能优化,字段类型考虑很重要,整数(int)字段类型分有符号和无符号两种(UNSIGNED属性就是将数字类型无符号化,与C.C++这些程序语言中的unsigned含 ...

  9. python语言的三种数字类型_Python语言中的类型之数字类型--Python(10)

    数据从不一样的角度能够用不一样的含义去解释它,如: 10,011,101 对上面这个数据,咱们有以下多种含义去解释它: 1)它是1个二进制数字,或者是1个十进制数字: 2)一段文本: 3)用 , 号分 ...

最新文章

  1. C# 获取 IE 临时文件
  2. python映射类型-python2.x学习笔记(8)-映射和集合类型
  3. 安全声明标记语言SAML2.0初探
  4. Navicat for MySQL 连接 Mysql 8.0.11 出现1251- Client does not support authentication protocol
  5. linux下使用TC模拟弱网络环境
  6. Mysql for linux 安装
  7. java读取复杂csv文件内容_java读取并导出多类型数据csv文件
  8. AW_blog 在任意页设置文章的数量
  9. 函数的参数可以是数组吗_C++数组长度可以为变量吗?
  10. linux 小红伞使用手册,安装LINUX下小红伞图文教程.pdf
  11. 12306为什么要安装根证书
  12. 2.70-写出具有如下原型的函数的代码:
  13. Wincc语音报警 Wincc真人声音报警
  14. 渗透测试技术_Nessus工具(一)Linux centos7下 Nessus8.13的下载、安装
  15. 七年未必痒:如何营造亲密关系的新鲜感?
  16. 纯MSDOS操作系统下的计算机重启与关机
  17. 【Java项目】社区论坛项目
  18. 推荐系统(一):不了解推荐系统,基本在被out的队列,岌岌可危
  19. LeeCode 1467 dfs + 组合数
  20. Default interface methods are only supported starting with Android N (--min-api 24):

热门文章

  1. Leetcode 部分题解
  2. 今天题不难,写个题解吧
  3. hermit插值 matlab,分段线性插值和分段Hermit插值课程设计
  4. linux跑火车的命令sl
  5. 机器学习(十二)-基于规则的分类器
  6. 推荐几个蚂蚁、腾讯、抖音大佬的公众号
  7. 【2018VR眼镜推荐】VR眼镜怎么选?哪个VR眼镜好一些,VR眼镜需要注意什么?
  8. Nutanix 推出 Karbon 2.1,解决 Kubernetes 网络和存储挑战
  9. 等额本息与等额本金问题的分析
  10. 使用Heroku将代码部署到云端服务器