您的位置:首页 > 编程语言 > C语言/C++

负数的二进制表示及有符号数与无符号数之间的转换

2015-10-26 22:30 453 查看
讲到有符号数与无符号数的转换,首先得说一下数字在计算中的二进制表示。无符号数表示相对简单,直接转换为二进制即可;有符号数则是将最高位作为符号位。所以对于单字节无符号数表示范围为:0~255;有符号数表示范围为:-128~127。
无符号数表示如下,对于a=3:
1字节表示为:0000 0011
4字节表示为:0000 0000 0000 0000 0000 0000 0000 0011
有符号数中正数表示方法与无符号数表示方式一样,而在计算机存储中,负数表示并不是简单地将正数二进制最高位用1表示,如符号数1000 0001并不是-1。而是用补码表示,a=-1:
1字节表示:
原码:1000 0001
反码:1111 1110
补码:1111 1111
4字节表示:
原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
所以-1在计算机存储中1字节和4字节二进制表示分别为:0xFF,0xFFFFFFFF。
1 无符号数转换为有符号数
看无符号数的最高位是否为1,如果不为1(即为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。
无符号数 a=255,首位为1,表示负数,其余为按位取反,
单字节表示:1111 1111
按位取反  :1000 0000
加1得    :1000 0001
得到-1;所以无符号数255转换为符号数为-1。
2 有符号数转换为无符号数
看有符号数的最高位是否为1,如果不为1(即为0),则无符号数就直接等于有符号数;如果有符号数的最高位为1,则将有符号数取补码,得到的数就是无符号数。
将符号数-1转换为无符号数过程如下:
1000 0001
1111 1110
1111 1111
最终结果可得-1转换为无符号数255。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++