数据类型介绍
我们知道C语言有很多内置类型:
char //字符数据类型 1 个字节
short //短整型 2 个字节
int //整形 4 个字节
long //长整形 4 个字节
long long //更长的整形 8 个字节
float //单精度浮点数 4 个字节
double //双精度浮点数 8 个字节
以及他们的存储空间大小。如果把他们归类:
数据归类
有人会说为什么 char 也是整形家族的,因为字符在内存存储的是ASCLL值,ASCLL值是整形
通常来说 int 一般就是 signed int 有符号的整数,但是 char 没有规定有无符号,但是大部分都是有符号的。(整形家族还有long long 只是没在图上写出来了)
这里都只简单列举了几个,我们重点要说的是整形在内存中的存储
整形在内存中的存储
我们知道变量是需要在内存中创造空间的,空间的大小根据类型定,所以数据在内存中到底是怎么存储的呢?
原码,反码,补码
之前我们讲过,整形在内存中存储的都是二进制的形式,分为无符号和有符号的整形类型
有符号的最左边的一位是符号位,0是整数,1是负数。无符号的没有符号位全是有效位。
类如:
有符号的 int 整形 a 在内存中就是 00000000 00000000 00000000 00001010,因为 int 是4个字节,就是32个比特位,图片里是16进值的表现形式而已方便看(二进制变成16进值,4个比特位表示一个16进值位),我们看看负数的:
负数 b 应该是 10000000 00000000 00000000 00001010啊,为什么是这样的,因为在内存中存储的是补码,而刚刚的是原码,在前面操作符的时候讲过,补码等于原码取反加1,原码取反就是反码(取反符号位不变)。b在内存中应该是 11111111 11111111 11111111 11110110。换成16进值刚刚好。正数的原码,反码,补码都相同。只有负数需要计算。
如果是无符号的是什么样的:
答案是无符号的存储还是一样的,只是最左边的没有符号位了。
我们看到内存中存储的顺序好像不太一样,这是因为大小端存储模式的原因,后面会讲。
典型列子(解题思路)
有无符号的整形提升与截断:
一:输出什么?
这里就需要整形提升,答案是:
分析:-1的原码是 10000000 00000000 00000000 00000001
补码是 11111111 11111111 11111111 11111111,因为是 char 形,1个字节,要截断为8个位,所以从右边开始截断为 11111111,%d 是打印有符号的,所以先整形提升,整形提升如果是有符号的,补符号位的数字,所以是1,整形提升之后为 11111111 11111111 11111111 11111111,%d打印都当有符号处理,所以负数转为原码,又是取反加1,变为-1。这就是 char a 的分析与 b 是相同的。为什么 c 不一样,因为无符号整形提升是补0的,所以 c 整形提升后是 00000000 00000000 00000000 11111111,打印一看符号位不是1,就是正数了,正数原码,补码都一样,所以是255。