别看了!C语言里的unsigned int/char 看我就够了

写在前面:这里是小王成长日志,一名普通在校大学生,想在学习之余将本身的学习笔记分享出来,记录本身的成长轨迹,而且帮助可能须要的人,平时博客内容主要是一些学习笔记(系统的,会附带思惟导图,就像我以前一个专栏-数据科学导论同样),项目实战笔记,一些技术的探究和本身的一些思考。欢迎你们关注,大家的每个评论点赞关注我都会仔仔细细去看的。有任何问题欢迎交流,我会尽我所能帮助你们的,共创CSDN美好环境。html



1.前置知识点

原码,反码,补码


这里关于计算机中原码,反码,补码的知识受篇幅限制,这里只是简单介绍一下,更详细的讲解请前往另外一篇博客<原码,反码,补码,究竟是个啥? -?,你来这看看吧。>查看,两篇放在一块儿看效果可能更好哦。web


原码:原码是一个数在计算机中最简单的表达形式,由符号位(0正1负)和数值位(绝对值)组成svg

  • 可是会有两个0: +0(0000 0000) 和 -0(1000 0000)

反码:原码除符号位外按位取反(1与0的互换),只对负数有意义,正数反码仍是本身学习

例如:spa

原码 反码
0000 1111 0000 1111
1000 1010 1111 0101

补码:反码加1,仍是只对负数有意义,正数补码仍是本身.而负数在计算机中以其补码形式表达
例如(以-5为例):.net

原码(符号位+数值位) 反码(除符号位外按位取反) 补码(反码+1)
10000000 00000000 00000000 00000101 11111111 11111111 11111111 11111010 11111111 11111111 11111111 11111011
  • 补码实际上是方便计算机中减法而存在的,在计算机中,减去一个数等于加上一个数的补码,这其中涉及到了“模”的概念,有兴趣或者不懂的能够先去百度百科看看日志

    参考:
    百科-反码
    百科-补码
    百度文库code

2.有符号数和无符号数

有符号数和无符号数最主要的区别

  • 在计算机中无符号数用原码表示, 有符号数用补码表示xml

  • 就像他们的名字同样区别就在于有无符号htm

    • 无符号数全部位数都用于表示数值
    • 有符号数和上面提到的原码反码补码同样,都由符号位(最高位 0正1负)和数值位组成

它们的表示范围不一样:

  • *在n位无符号数中,由于全部位都用于表示数值,因此其范围直接是0-2n-1)**(*共有2n个不一样的数)
  • 而在有符号数中,因为最高位被用于表示数值的正负,因此其能表示的数值的最大值会缩水,可是会在负轴方向进行伸展

以下所示:

无符号 有符号
单字节(8位) 0~255 -128~127
双字节(16位) 0~65535 -32768~32767
n位 0~ 2^n - 1 - 2^n ~ 2^n - 1
  • 其实能够感受出来,有符号数和无符号数在一样的位数下他们可以表达的数的个数是一致的
    • 可是补码中 +0 = -0 ,因此,-0 这个位置能够空出来,所以就在负数的区域中多出一位,由原来的 -0 ~ -127,变成 -1 ~ -128,也仍是128位,而正数方向则是0 ~ 127,也是128个数,二者是对称的。(本身能够尝试下对 -0 取补码)

      原码 反码 补码
      1000 0000 1111 1111 1000 0000
    • 也能够这么理解:

      • 咱们想想,在 -1 ~ -128 中 -1 是最大的,因此 -1 是这个在这个情境下最大的负值,即为1111 1111 ,
      • 而咱们对于 1111 1111 -1 的值为 1111 1110 其值为-2(能够本身从补码推回原码)
      • 一直这样减下去,直到最小的负值1000 0000 值就是-128
    • 这样负数方向也是 -1 ~ -128,正数方向不变

    • 参考:C语言系列(二)有符号数和无符号数详解)

二进制(1字节) 十进制值
1111 1111 -1
1111 1110 -2
1111 1101 -3
……… ………
1000 0001 -127
1000 0000 -128

3.有符号字符和无符号字符

  • 首先咱们必须知道在C语言中插**char类型是只占一个字节(8位)**的
  • 其次,在C语言中,若是咱们留意,咱们是可以发现char 字符类型的存储方式实际上是存字符的ascii码,所以有些时候咱们对字符和整数直接进行加减运算也是可行的。
int main(void)
                {
                    char ch = 'c';
                    printf("%d",ch);//打印结果是99,为'c'的ancii码
                    printf("%c",ch+5);//打印结果为h
                }
  • 可是在C语言中还有 unsigned char这个不省心的东西
    其实也蛮简单的,在C语言中 unsigned char能表示的范围是 0 ~ 255,跟普通的无符号数是一致的,
    而普通的char类型能表示的范围是-128 ~127,这与有符号数是同样的

  • 最后,关于这里表示的范围其实通常只在与整数进行运算时是须要注意的,而在表示字符时咱们则不须要太过关心

4.参考:

  • 详见原文超连接

都看到这里了,各位哥哥姐姐叔叔阿姨给小王点个赞 关个注 留个言吧,和小王一块儿成长吧,大家的关注是对我最大的支持。


若是以上内容有任何不许确或遗漏之处,或者你有更好的意见,就在下面留个言让我知道吧-我会尽我所能来回答。