原码、反码、补码、取反运算~、以及单目运算符 -
2017-06-09 19:17
288 查看
正数原码、反码、补码形式一致。
负数反码,为其原码的符号位不变,其他位取反; 负数补码,是其反码加1。
举例8bit有符号型整数:
+34 原码 = 反码 = 补码:00100010
-34 原码 = 10100010,反码 = 11011101,补码 = 11011110
不管是在32还是在64位编译器处理下,int都是4字节32位,所以整数范围是-2147483648 ~ 2147483647,数值以补码形式存储。
【注意】最小负数-2147483648 = -231并没有原码和反码,只有补码,由 -0 的原码1 0...0(31个0)表示 。
因此:
1、~i:[b]对每一位取反运算[/b]。
为01...1(31个1),是正数,补码即原码,即231-1 = 2147483647;
2、 -i:对该数求补运算,即每位取反运算,再加1。
取反, 10...0(31个0)-> 01...1(31个1),再加1得
10...0(31个0),该补码表现为最小负数-2147483648,并没有原码和反码;
3、1-i:补码形式相加,再推回原码得十进制结果。
即-i( 10...0(31个0) )+(0 ...1(31个0) )=10...1(30个0),此为补码形式,补码转原码为补码减1,再非符号位取反,即原码1...1(32个1)= -(231-1) = - 2147483647;
4、 -1-i :补码形式相加,再推回原码得十进制结果。
即-i( 10...0(31个0) )+(1 ...1(32个1) )=
01...1(31个1),是正数形式,原码即补码,为231-1= 2147483647 。
源程序如下:
运行结果如下:
负数反码,为其原码的符号位不变,其他位取反; 负数补码,是其反码加1。
举例8bit有符号型整数:
+34 原码 = 反码 = 补码:00100010
-34 原码 = 10100010,反码 = 11011101,补码 = 11011110
不管是在32还是在64位编译器处理下,int都是4字节32位,所以整数范围是-2147483648 ~ 2147483647,数值以补码形式存储。
【注意】最小负数-2147483648 = -231并没有原码和反码,只有补码,由 -0 的原码1 0...0(31个0)表示 。
因此:
1、~i:[b]对每一位取反运算[/b]。
为01...1(31个1),是正数,补码即原码,即231-1 = 2147483647;
2、 -i:对该数求补运算,即每位取反运算,再加1。
取反, 10...0(31个0)-> 01...1(31个1),再加1得
10...0(31个0),该补码表现为最小负数-2147483648,并没有原码和反码;
3、1-i:补码形式相加,再推回原码得十进制结果。
即-i( 10...0(31个0) )+(0 ...1(31个0) )=10...1(30个0),此为补码形式,补码转原码为补码减1,再非符号位取反,即原码1...1(32个1)= -(231-1) = - 2147483647;
4、 -1-i :补码形式相加,再推回原码得十进制结果。
即-i( 10...0(31个0) )+(1 ...1(32个1) )=
01...1(31个1),是正数形式,原码即补码,为231-1= 2147483647 。
源程序如下:
#include "stdio.h" #define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ int main() { /*int i = -2147483648;*/ //error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型 int i = INT_MIN; printf("%d,%d,%d,%d\r\n", ~i, -i, 1 - i, -1 - i); return 0; }
运行结果如下:
相关文章推荐
- java 原码、反码、补码计算 以及 取反(~)运算
- java语言基础(6)——原码反码补码以及二进制的负数运算
- C语言中八进制和十六进制怎么表示以及原码、反码、补码、C语言按位取反运算符~
- 原码, 反码, 补码 详解以及负数的按位与运算
- 位运算以及原码反码补码的介绍和案例
- 有关原码、反码以及补码的一些想法
- Java基本数据类型与位运算、原码&补码&反码
- JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)
- 位运算: 与”&、“非”~、“或||”、“异或”^ ;原码 反码 补码的相互转化
- 原码、反码、补码、移码,二进制运算
- 原码,反码,补码 及 移位运算
- 数的表示与运算:原码、反码、补码和移码
- 原码,反码,补码及运算
- 关于原码反码补码以及位元算
- 二进制(原码,反码,补码),位运算原则:
- Java原码、反码和补码的算法,Java跨平台原理,以及JDK安装目录说明
- 二进制原码,反码以及补码实战
- C语言中八进制和16进制怎么表示,原码,反码及补码,C语言按位取反运算符~
- 原码,反码以及补码