图解c语言数据类型

数据类型

首先我们在c语言初阶学习的过程中知道,c语言有很多不同的数据类型,用于存储不同的数据  

char //字符数据类型--1byte
short //短整型--2byte
int //整形--4byte
long //长整型--基于系统和运行环境不同分为4byte或者8byte
long long //更长的整形--8byte
float //单精度浮点数--4byte
double //双精度浮点数--8byte

其实上面的各个基本的数据类型还可以细分为有符号与无符号两种,但因为其不是本篇文章的重点就不一一赘述,接下来让我们了解一下字符类型,整形类型,浮点数类型的数据是如何存储的

字符类型

首先我们知道字符类型有unsigned char与char两种类型,且都为1个字节——8个比特位,那么就由最高一位决定字符类型的正负

既然最高位表示正负,那么决定数据的范围也就剩下7个比特位了

那么表示正数的数据范围如下
0000 0001
0000 0010
.
.
.
0111 1111//不断累加
也就是0~127

但我们会发现一个问题,当char为127的时候如果再+1就会变为1000 000,最高一位又是表示符号位,那这个怎么算呢?把他当作负0?好像也不是很合理

为了防止这个不合理的出现,这时候我们规定了1000 0000为负128(-128)

1000 0000//-128
1000 0001//-128+1=—127
1000 0010//—126
.
.
1111 1111//-1
如果此时再加1,理论上如果比特位够的话就是10000 0000,
但是字符类型只有八个比特位,所以会进行截断,也就是变成0000 0000——重新变为0了

 细心一点我们就会发现,好像字符类型的数据存储是一个循环?

其实是的,字符类型的数据存储是一个循环,是一个闭合的圆圈

 顺时针是+1的过程,逆时针就是-1的过程,这样我们就能清楚明白的了解字符类型的数据存储了

整形类型

整形由四个字节——32个比特位组成,最高一位的比特位表示正负,为1为负,为0为正

在了解整形数据的存储之前,我们应该了解一下一些相关的计算机知识

  • 计算机在底层存储数据的时候,一律存储的是“二进制的补码形式”
  • 对于一个正数来说:二进制原码、反码、补码是同一个,完全相同
  • 对于一个负数来说:反码等于原码符号位不变,其他位取反 ;补码等于反码+1

而电脑存储整形时一律存储的是补码

范围则是:-2147483648~2147483647

整形的存储就是如上那么简单

到此我们也就顺利学完了两种类型的存储,但是这两种类型还存在联系——整形提升

什么是整形提升呢?

也就是比int类型小的进行计算时,要将小于整形的数据(char,short)提升到32个比特位——根据最左边的数字进行提升,1则全补1,0则全补0,再进行运算操作;

当符号数与无符号数对比时,先将符号数转化成无符号数,在进行对比

 

 此题a+b为整形提升后的相加,所以仍然是整形,为32个比特位,结果为300。而c为unsigned char,要进行截断,为8个比特位,所以结果为44

浮点型数据类型存储

当我们学完整形与字符类型存储后,会发现两者算是大同小异的,那么浮点型数据类型存储也会是这样吗?

我们从下面一题就可以了解,大家可以先试试看,写出打印的结果

#include<stdio.h>
init main()
{
    int n=9;
    float*p=(float*)&n;
    printf(%d,n);
    printf(&f,*p);
    
    *p=9.0;
    printf(%d,n);
    printf(%f,*P);
}

如果和整形存储一样,那么打印的结果也应该是差不多的,那我们来看看解果

 答案应该是显而易见的,浮点型数据的存储和整形字符型应该是完全不相等的,在了解具体存储过程之前,我们应该了解在一些其他基础知识

首先,我们知道电脑是二进制存储的,所以几乎任何一个数都可以用二进制表示,以5.5为例子举例一下

 

但是这样存储也有缺陷,就是浮点型数据无法精确的存储,就比如5.3,后面的0.3只能无限由0.25+0.125+.....不断接近

我们一般将数据二进制表示后移动成1的几乘2的n次方,这时候1的后面的小数位为M,2的n次方的n为E,而最高位的比特位用来表示正负,也就是(-1)^s,0则为正数,1为负数

所以浮点数的表示为:(-1)^s * 1.M * 2^E

 

 但是E的存储十分复杂,因为我们知道科学计数法是允许负号出现的,而E此时被规定为无符号的,范围为0~255,所以我们决定在实际数字存进去之前再加上一个中间值127

当E的8个比特位全为0时,实际的数字为-127,我们知道2^127是一个非常非常小的数字,已经约等于0了,所以我们这时把M前的1改为0,也就是(-1)^s * 0.M * 2^E,这样做是为了表示+-0,以及接近于0的很小的数字

当E的8个比特位全为1时,实际数字为128,2^128是一个非常非常大的数字,则M为0,也就是(-1)^s * 1.0 * 2^E,以表示很大的数字

至此,关于c语言的数据存储差不多讲完了,希望大家能有所收获,也希望大家给个点赞,谢谢各位的观看。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值