小酌数据一口

简介: 数据类型

目录

数据类型

1.内置类型

整型家族

浮点型家族

2.构造类型

数组类型

结构体类型

枚举类型

联合类型

3.指针类型

int* 整型指针

float* 浮点型指针

char* 字符型指针

void* 空类型指针

4.空类型

void

数据存储

整形存储

char

int

short

浮点型存储

float



数据类型

1.内置类型

char 字符数据类型

short 短整型

int 整型

long 长整型

long long 更长的整型

float 单精度浮点型

double 双精度浮点型

整型家族

char

有符号还是无符号取决于编译器,大部分编译器下是signed char

unsigned char

signed char

short

unsigned short【int】

signed short【int】

int

unsigned int

signed int

long

unsigned long【int】

signed long【int】

浮点型家族

float

double


2.构造类型

数组类型

int a = 10 去掉名字就是类型所以a的类型就是int

int arr 【10】 = {0}去掉名字arr 所以这个数组类型是int 【10】数组类型是自定义的所以它也是构造类型

结构体类型

枚举类型

联合类型


3.指针类型

int* 整型指针

float* 浮点型指针

char* 字符型指针

void* 空类型指针


4.空类型

void

表示空类型 通常用在函数的返回值类型,函数的参数,指针类型


数据存储

整形存储

char

image.png

image.png

 #include<stdio.h>
 int main()
 {
     //char的范围-128~127
     char a = 128;
     //00000000000000000000000010000000原反补相同
     //10000000
     //11111111111111111111111110000000
     //4,294,967,168
     char b = -127;
     //10000000000000000000000001111111原
     //11111111111111111111111110000000反
     //11111111111111111111111110000001补
     //10000001
     //11111111111111111111111110000001
     //4,294,967,169
     printf("%u\n", a);
     printf("%u\n", b);
     return 0;
 }

打印无符号整形 %u

打印有符号整形 %d


int

整形最大值INT_MAX,最小值INT_MIN定义在limits.h头文件里面

 #include<stdio.h>
 int main()
 {
     int i = -20;
     //10000000 00000000 00000000 00010100
     //11111111 11111111 11111111 11101011
     //11111111 11111111 11111111 11101100    补码
     unsigned int j = 10;
     //00000000 00000000 00000000 00001010    原反补
     int a = 0;
     unsigned int b = 0;
     a = i + j;
     printf("%d\n", a);  
     //11111111 11111111 11111111 11101100
     //00000000 00000000 00000000 00001010
     //相加之后  
     //11111111 11111111 11111111 11110110
     //11111111 11111111 11111111 11110101
     //10000000 00000000 00000000 00001010   -10
     b = i + j;
     printf("%u\n",b);
     return 0;
 }

同样的数据存储,由于看待的视角不同,所以打印出来的结果就不同

image.png


short

image.png

image.png


浮点型存储

float

浮点型大小限制头文件在float.h头文件里面

image.png

 #include<stdio.h>
 int main()
 {
     int n = 9;
     float* pf = (float*)&n;//站在浮点型角度去访问这个空间,那为什么会不一样呢,说明浮点型数据存储方式和整形存储方式是不一样的
     printf("%d\n", n);
     printf("%f\n", *pf);
     *pf = 9.0;
     printf("%d\n", n);
     printf("%f\n", *pf);
     return 0;
 }


根据国际标准IEEE(电子和电子工程协会)754,任意一个二进制浮点数V可以表示成下面形式:

(-1)^S*M*2^E

(-1)^S表示符号位,当s=0,v为正数;当s=1,v为负数

M表示有效数字,大于等于1,小于2

2^E表示指数位

上面那个是什么鬼玩意是不是觉得懵逼了,下面我们举个例子

image.png

 

所以9.0的二进制表现形式可以表示为

    10010.0

    1.001*2^5

    因此(-1)^0*1.001*2^5

IEEE754规定:

对于32位的浮点数,最高位是符号位s,接着的8位是指数E,剩下的23位为有效数字M

image.png

对于64位的浮点数,最高的一位是符号位,接着的11位是指数位,剩下来的52位是有效数字M

image.png

IEEE 754对有效数字M和指数E,有一些特别规定

因为1<=M<2,也就是说,M可以写成1.xxxxx的形式,其中xxxxxx是小数部分

IEEE 754规定,在计算机内部保存M时默认这个数的第一位总是1,所以可以被省略,只保留后面的xxxxxx就好。比如1.01就保存01,等读到他的时候把1加上去就好,这样可以节省一位有效数字

至于E的话

E作为一个无符号整数(unsigned  int)8位范围0~255,11位范围0-2047,但实际上科学计数法中的E是可以位负数的,所以IEEE  754规定,存入内存时的E必须再加上一个中间数,8位就加127,11位就加1023,(什么意思呢  就是我们求的真实的E加上一个中间数再存到内存中)

image.png

这些仅仅是存进去的那我们是如何取出来的呢?

E在内存中有三种方式可以取出

E不全为0不全为1

这时浮点数就采用下面的规则,E的计算值减去127(或1023),得到真实值,再将有效数字M前面加上第一位1

E全为0

这时浮点数的指数E直接等于1-127(或1-1023)为真实值

有效数字M不再加上第一位的1,而是还原为0.xxxxxxxxx的小数,这样做是为了表示正负0,以及接近于0的很小数字

E全为1

如果有效数字M全为0,表示正负无穷大(正负取决于s)

所以那个题目就好解了

 #include<stdio.h>
 int main()
 {
     //float b = 1.5f;
     //(-1)^0*1.1*2^0
     //0+127
     //0 0111 1111 1000 0000........
     //整合一下0011 1111 1100 0000 .........
     //3f c0 00 00
     int n = 9;
     //00000000 00000000 00000000 00001001
     float* pf = (float*)&n;
     //换个视角看内存
     //他会认为E是全0 所以是无限小 所以打印出来的是0.000000
     printf("%d\n", n);
     printf("%f\n", *pf);
     *pf = 9.0;
     //1001.0
     //1.001*2^3
     //3+127 = 130
     //0 1000 0010 0010 000 ........
     //0100 0001 0001 0000 0000 0000 0000 0000
     //如果是整形视角的话就是1,091,567,616
     printf("%d\n", n);
     printf("%f\n", *pf);
     return 0;
 }

image.png

 


目录
相关文章
|
11月前
|
机器学习/深度学习 Python
乌鸦喝水之谜
乌鸦喝水之谜
96 0
|
11月前
【每日一道智力题】之 赛马找最快
【每日一道智力题】之 赛马找最快
99 0
《人间清醒语录》
今天,我们想分享来自大淘宝技术工程师们的《人间清醒语录》,这些金句里凝结了他们多年实践经验的智慧,希望可以给你“打怪升级”的过程带来一些帮助。
181 0
A计划救公主
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
154 0
小猴打架
题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友。每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友。经过N-1次打架之后,整个森林的小猴都会成为好朋友。 现在的问题是,总共有多少种不同的打架过程。
117 0
小猴打架
|
存储 算法
有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
390 0
有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
|
弹性计算 Linux 数据库
发生了这种情况,数据还有救吗?
这样的惊喜还是少一些吧!
626 0
发生了这种情况,数据还有救吗?
和“利奇马”赛跑的男人
超强台风“利马奇”,国际编号:1909,正在向浙江沿海靠近。这是今年以来登陆我国的最强台风。
1788 0