C语言中 char 类型的取值范围为什么是-128~127

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CodeByCoder/article/details/77725155

我们之前已经说过关于原码、反码和补码的一些东西,如果你没有看过,可以点这里《 你知道原码、反码和补码吗,进来了解一下吧 》看一下 。


好了,可能你不会太想看,所以我们一起再来简单的复习一下,如果我们现在有一个十进制的整数 1 ,我们知道 1 个字节等于 8 位,一个整型数据占 4 个字节,也就是说一个整型数据占 4 个 8 位,也就是 32 位,所以整数 1 用二进制表示,如下:


0000 0000 0000 0000 0000 0000 0000 0001


这串二进制数我们就可以看成是整数 1 的原码,那么整数 1 的反码和补码是什么呢,这里我们只需要记住一句话即可,就是正数的原码、反码和补码是相同的,所以整数 1 ,由于它是正数,所以它的原码、反码和补码都是:


0000 0000 0000 0000 0000 0000 0000 0001


正数相对简单,所以我们介绍到底为止,如果你不知道整数 1 的原码为什么是这串,你可以上网查一下关于十进制转二进制的问题,这里假设你们已经很清楚了,因为本文的重点不在讨论进行的转换问题上,或者你可以阅读我之前的文章了解一下如何进行二进制打印《 十进制可以直接打印八进制和十六进制,那么如何打印二进制呢,对,右移 》 。


好了,接下来我们看一下负数的原码、反码和补码,我们用 -1 来举例,对于负数,我们的第一位数字开始有了作用,当第一位为 0 时表示是正数,当第一位为 1 时表示是负数,所以 -1 的原码就是:


1000 0000 0000 0000 0000 0000 0000 0001


那么反码是什么呢,反码就是在原码的基础上符号位不变,其它位按位取反,所以反码如下:


1111 1111 1111 1111 1111 1111 1111 1110


有了反码,补码就简单了,就是在反码的基础上加上 1 ,计算过程如下:


1111 1111 1111 1111 1111 1111 1111 1110
0000 0000 0000 0000 0000 0000 0000 0001
---------------------------------------
1111 1111 1111 1111 1111 1111 1111 1111


然后我们就得到了 -1 的补码,如下:


1111 1111 1111 1111 1111 1111 1111 1111


怎样验证它对不对呢,你可以打开 Xcode ,直接输入如下代码运行看结果:


printf("%i\n", 0b11111111111111111111111111111111);


看看结果是不是 -1 。


好了,复习完毕,接下来回到今天的正题上,首先我们看一下无符号位的 char 类型,我们知道 char 类型只占一位 。


所以如果是无符号 char 类型,那么它的取值范围就是:


00000000 ~ 11111111


即 0 ~ 255 。


如果是有符号的 char 类型,我们已经通过标题知道了它的取值范围是 -128 ~ 127,因为有符号的 char 类型,则是分为正数和负数,所以,当然就存在两个范围段,0 ~ 127 和 -0 ~ -127,但是我们知道 -0 是说不通的,所以这时候这个 -0 要怎么办呢,那么 -128又是怎么出来的,考虑到一个不在了一个莫名多出来了,所以我们可以假设 -0 就是 -128 ,既然有了假设,接下来我们就来验证到底是不是这样 。


首先我们看一下 -128 的原码是多少,如下:


0b1111 1111 1111 1111 1111 1111 1000 0000


你可以将其用 printf 进行打印,看一下结果是否为 -128 ,为了方便看,我们只看最后 9 位,第一位为符号位,是 1 ,后面就是 1000 0000 ,就是 -128 ,原码为 1 1000 0000 ,反码就为 1 0111 1111 ,补码为 1 1000 0000 ,我们可以发现,原码和补码居然是一样的,虽然 -128 是一个负数,但它的原码和补码居然一样了,好了,由于 char 类型只占 1 个字节,也就是 8 位,所以我们要把最高位的 1 舍去了,这时候得到的八位二进制数为 1000 0000 ,刚好就和 -0 的原码相同,所以可以把 -0 直接看成是 -128 了,这是我的个人见解,欢迎批评指正 ,因为这确实是一个有意思的事情 。


如果你对Xcode感兴趣,欢迎关注我的微信公众号!


猜你喜欢

转载自blog.csdn.net/CodeByCoder/article/details/77725155