下面我们来看一组代码
计算机存储时是以补码的形式存储的
-1的原码(以32为例)
1000 0000 0000 0000 0000 0000 0000 0001
存储时为补码
即
1111 1111 1111 1111 1111 1111 1111 1111
Char型大小为一个字节
发生截断即1111 1111
在unsigned char ,signed char 和char型里储存的都是1111 1111
但在以%d打印是确有所不同,运行结果如图所示
Signed char类型与char类型打印值相同,这取决于
编译器有的编译器认为char型是无符号的,有的认为
是有符号的,显然在啊哈C里char是有符号类型的,现在要做的就是区分unsigned char和signed char 有什么区别
Unsigned char类型和signed char类型存储时都是1111 1111
但是在取值时类型不同就产生了差异
我们知道最高位是整数的符号位,而unsigned char类型计算机则认为没有符号位,在打印时以%d打印需要进行提升,当unsigned char提升到int时高位补符号位,而unsigned char没有符号位,所以高位补0即:
0000 0000 0000 0000 0000 0000 1111 1111(补码)
而正数的原,反,补码相同,取出时也是这个值,而1111 1111换算成十进制数就是255;
接下来我们再来讨论signed char类型:
同样在以%d打印时需要进行提升,高位补符号位,即补1
此时补码为
1111 1111 1111 1111 1111 1111 1111 1111
换算成原码即
1000 0000 0000 0000 0000 0000 0000 0001
换算成十进制数即为-1。