一,有符号数和无符号数
1.有符号数:正数,0,负数。
(signed)int,(signed)char,其中signed可省略不写。
2.无符号数:正数,0。signed
unsigned int ,unsigned char。
二,8bit数据的存储
char,有符号类型,在内存中占一个字节(一个字节等于8位),可以表示负数,0,正数。表示的数据[-128~127].
unsigned char ,无符号类型,在内存中占1个字节。可以表示0,正数。表示的数据范围[0~255].
三,源码,反码和补码
无符号类型的数:源码,反码和补码都相同
eg.1
十进制的10,转化为二进制为
源码:00000000 00000000 00000000 00001010
反码:00000000 00000000 00000000 00001010
补码:00000000 00000000 00000000 00001010
有符号类型的负数:源码转化,反码除符号位取反,补码反码加一;
有符号类型的正数:原码=反码=补码。
eg.2
十进制的-10,转化为二进制为
源码:10000000 00000000 00000000 00001010
反码:11111111 11111111 11111111 11110101//符号位不变,其他位取反
补码:11111111 11111111 11111111 11110100 //在反码基础上加一
超出范围数据的计算方法
超出范围数据的计算方法先计算整数的补码(=右边的数)把补码赋值给变量,
然后观察变量的数据类型, 若是为unsinged char类型,一定为正数或0,原,反,补一样.
%d输出的原码就是补码,直接转换为元素输出即可。
若是为char类型,观察变量内存存储数据的最高位,1 表示为负数,%d输出需要转换为原码输出。
eg.3
char a=200;
//200的原码:00000000 00000000 00000000 11001000
//200的反码:00000000 00000000 00000000 11001000
//200的补码:00000000 00000000 00000000 11001000
因为char占一个字节,即占二进制的8位数,所以进行赋值时,将11001000赋给变量a。
这样以来,首位就变成了1,而有符号类型的数中,首位1表示负数。
在计算机的二进制中,存储到计算机的二进制是这个数的补码。
所以我们还需要进行转换。
转换如下:
a的补码:11001000
a的反码:11000111
a的原码: 10111000
原码进行加权运算:-(1*2^5+1*2^4+1*2^3)=-56;
故char类型的a=-56;
是不是很神奇。