1. 整型
整型包括long long, long, int, short, char, unsigned int, unsigned long long.....
整型在内存中以二进制补码的形式存储
先说有符号负整数,它最复杂
eg:
int a = -1;
原码:1000 0000 0000 0000 0000 0000 0000 0001(最高位的1表示正负,1为负,0为正)
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
从例子中可以看出,一个有符号的负数是这样在内存中存储的
首先写出-1的二进制编码,这个二进制编码就是原码
然后对原码进行按二进制位取反,得到反码
最后将反码加1,这样就得到了-1在内存中的补码,也就是-1的存储形式
再看有符号正整数和无符号整数
对于正整数,它的原码,反码,补码一样
对,就是这么简单,你只需要将一个正整数的二进制编码写出来,这个编码就是补码
那,了解这些有什么用呢?
看这个
输出结果可不是-1,而是255
为什么是255,而不是其他的数呢?
关于这个问题,就要用到数据的存储的知识了
首先对于-1,在内存中的补码是
1111 1111 1111 1111 1111 1111 1111 1111
再将-1存入a中,a又是unsigned char类型,大小为1个字节,8个比特位,于是-1的补码先截断成8个字节,得到新的补码:1111 1111,又由于无符号整型原,反,补码相同,则1111 1111也为原码,将其变为十进制编码,就是255,因此输出的就是255
再看一个
这是糊涂蛋写的代码(没错就是我),这个代码死循环了,其实很好理解,unsigned是无符号,不可能为负数,因此for的条件恒为真,但是为什么0 - 1的结果是4294967295呢?
其实啊,和上一题的原因一样,0 - 1本得到的是-1,-1的补码是
1111 1111 1111 1111 1111 1111 1111 1111
当被解读成无符号数时,这个编码就是原码,算一下就是这个4294967295(2的32次方-1)
2.浮点型
浮点型可就比整型复杂多了
就拿 float 这个短一点的举例吧
![](https://i-blog.csdnimg.cn/blog_migrate/7ecc3007a0036b68eb1acb32deb9b699.png)
就写这么多吧,累了,一中午没睡,希望大家多多点赞评论
谢谢嘞!