关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

【C语言进阶】整型在内存中的存储(下)

发布时间:2023-06-29 15:00:26

2.unsigned和signed整型类的区别

先来一道题,通过题目来摸索!


char a= -1;


  原码:10000000 00000000 00000000 00000001


  反码:111111111  11111111  11111111 11111110


  补码:11111111 11111111 11111111 11111111(内存中存储方式:补码)


  但是char 占一个字节


 11111111


 要以%d输出,那么就会涉及整型提升。


                        整型提升的规则:与比自身类型低或者一些运算时,会发生整型提升


                        1.signed类型:正数提升时,补0;负数补1;(补当作最高位的符号位)


                        2.unsigned类型:提升时,直接补0;


那么,char a= -1,以%d输出时,整型提升时,


11111111


补后:11111111 11111111 11111111 11111111 存在内存中为补码,输出时要以原码输出


原码:10000000 00000000 00000000 00000001


(补码变原码,依旧是先取反(符号位不变!),再加一)


所以最终结果为 -1


signed char a = -1与char a = -1 是一样的。


在很多环境下,char,int都是有符号数!


所以结果还是 -1


unsigned char a = -1


  原码:10000000 00000000 00000000 00000001


  反码:111111111  11111111  11111111 11111110


  补码:11111111 11111111 11111111 11111111


  只取后面一个字节


 11111111


  整型提升(无符号数提升时补0 ):00000000 00000000 00000000 11111111(内存以补       码方式存储)


  最高位为0,是正数,正数原反补都相同,所以结果是  255.


一起来看结果

 相信大家已经有所了解,并且熟悉了吧,当然还需要多多练习!

趁热打铁吧!

(%u为无符号输出)


原10000000 00000000 00000000 10000000


反11111111 11111111 11111111 01111111


补11111111 11111111 11111111 10000000


char 10000000


整型提升 11111111 11111111 11111111 10000000


结果 :4294967168

答案:-10


结果对了吗?


总结

     1.在内存中,不管是正数还是负数,存储形式都是以补码的形式存储!!


     2.一般情况下,int,char等整型通常是有符号数。


     3.大小端


          大端:数据的低位保存到了内存中的高地址处,数据的高位保存到了内存的低地址处


          小段:数据的低位保存到了内存中的低地址处,数据的高位保存到了内存的高地址处


/template/Home/leiyu/PC/Static