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.大小端
大端:数据的低位保存到了内存中的高地址处,数据的高位保存到了内存的低地址处
小段:数据的低位保存到了内存中的低地址处,数据的高位保存到了内存的高地址处