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

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


文章目录

    • @[toc]
    • 1.前置知识点
      • 原码,反码,补码
    • 2.有符号数和无符号数
      • 有符号数和无符号数最主要的区别
      • 它们的表示范围不同:
    • 3.有符号字符和无符号字符
    • 4.参考:


1.前置知识点

原码,反码,补码


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


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

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

反码:原码除符号位外按位取反(1与0的互换),只对负数有意义,正数反码还是自己

例如:

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

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

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

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

2.有符号数和无符号数

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

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

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

    • 无符号数所有位数都用于表示数值
    • 有符号数和上面提到的原码反码补码一样,都由符号位(最高位 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.参考:

  • 详见原文超链接

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


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

你可能感兴趣的:(日常学习笔记,#,日常:C语言)