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

本文介绍了C语言中基本数据类型的取值范围,包括int、float、double和char。详细讨论了二进制、内存存储、原码、反码和补码的概念,并以char类型为例分析了其有符号和无符号的取值范围。同时,概述了int类型的取值范围以及float和double的存储方式和数值范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

数据在内存的存储方式:

10101101
00110010

三、 原码,反码,补码

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

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

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

原码00001011
反码00001011
补码00001011

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

原码10001101
反码11110010
补码11110011

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 91

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

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

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

类型字节数取值范围
int(有符号)4-231 ~ (231-1)
int(无符号)40 ~ (232-1)
char(有符号)1-27 ~ (27-1)
char(无符号)10 ~ (28-1)
float40以及1.2x10-38~3.4x1038(绝对值)
double80以及2.3x10-308~1.7x10308(绝对值)
### C语言基本数据类型及其取值范围 #### 整型数据类型 整型数据类型包括`char`, `short`, `int`等,在不同的编译器和平台上可能会有所不同,但在常见的32位或64位系统上通常如下: - **char**: 字符型变量占用1字节(8位),其取值范围是从-128到127(对于带符号字符)或是从0到255(对于无符号字符)。这取决于具体实现环境[^1]。 - **short int (简称 short)**: 短整形一般占两个字节(16位),可以表示的数值区间大约为−32,768至32,767;如果是unsigned,则能表达更大的正数范围即0~65,535。 - **int**: 普通整数通常是四个字节长(32位),能够覆盖更宽泛的负数到正数区域约±2,147,483,647。当声明成unsigned时则可达到0~4,294,967,295之间的任何正值。 #### 浮点型数据类型 浮点数用于处理实数,并且遵循IEEE 754标准来定义它们内部如何被编码保存于内存之中[^3]: - **float**: 单精度浮点数占据四字节空间(32位),它提供了大约六七位十进制有效数字精度,指数部分允许的最大绝对值约为\( \pm 3.4\times10^{38} \)[^3]。 - **double**: 双精度浮点数则是八字节大小(64位),拥有更高的准确性——大概十五十六位有效的十进制小数,而指数范围也扩大到了接近 \( \pm 1.7\times10^{308}\) 的程度。 通过使用`<limits.h>`头文件中的宏常量可以获得特定平台上的确切边界值,比如`CHAR_MIN`, `INT_MAX`等等。另外也可以利用预处理器指令`sizeof()`函数配合乘法运算得出各类型的长度单位是bytes而不是bits[^2]。 ```cpp #include <stdio.h> #include <limits.h> int main() { printf("Size of char : %lu bytes\n", sizeof(char)); printf("Range of signed char: [%d to %d]\n", CHAR_MIN, CHAR_MAX); // 更多其他类型... } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值