C\C++不经意间留下的知识空白------有符号数和无符号数

C和C++

C和C++应该是大多数工科生最先接触的两门语言,个人感觉这两门还是挺难的。今天在看面试题时,看到有符号数和无符号数时竟然懵了,这基础是有多不扎实啊!

有符号数和无符号数

对于浮点数来说都是有符号数,不存在无符号数。所以就拿8位一个字节的char类型来说一下这个有符号数和无符号数。
首先,对于无符号数我们知道:8位的话最大表示255
例:0000 0001 = 1
1111 1111 = 255
对于有符号数,我想很多就知道首位表示符号位,后面怎么表示的都忘了,我就是把这个忘了,才弄了挺久才搞懂。
首位是1表示负数,首位是0表示正数
例:那么-7,我想会有一部分是这样表示的1000 0111,很遗憾我开始就是这样,但它是不对的。
除去符号位,后面按位取反再加一,这才是负数表示方法
还拿-7来说,首先第一步:1000 0111 第二步按位取反:1111 1000,第三步加一:1111 1001
所以 -7 = 1111 1001
-8 > 1000 1000 > 1111 0111 > 1111 1000

同时还有一个点是无符号数和有符号数相加会自动转换成无符号数。
我们来操作一下-7+7 = 1111 1001 + 0000 0111 = 1 0000 0000,只有八位,溢出,得到结果为0.符合我们的认知 -7+7 = 0
再来操作一下-8 + 7 = 1111 1000 + 0000 0111 = 1111 1111 = 255 这和我们的常识是不一样的。编程时需要注意。
在这里插入图片描述
在编程的过程中尽量不要无符号数和有符号直接运算。因为中间会发生默认的类型转换。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_25105061/article/details/108219634