-
【C语言】有符号数的原码、反码、补码的区别与转换
2020-06-16 21:01:56n位二进制有符号数据的补码表示范围:[−2n−1,2n−1−1][-2^{n-1} ,2^{n-1}-1][−2n−1,2n−1−1]。 n位二进制无符号数据(正数)的补码(三码相同)表示范围:[0,2n−1][0 ,2^{n}-1][0,2n−1]。 6.补码的补码是...1.正数的原码、反码、补码均完全一样。
2.负数的反码:符号位不变,其它位取反。
3.负数的补码:符号位不变,其它位取反,最后加1。
4.计算机采用补码方式来储存数据。
5.n位二进制有符号数据的补码表示范围:。
n位二进制无符号数据(正数)的补码(三码相同)表示范围:。6.补码的补码是原码。
7.负数的原码和补码互相转换简单方法:从原码(或补码)的右边往左开始数,第一个不是0的后边的每一位数取反即是它的补码(或原码),符号位不变,还是“1”。
-
补码和原码的转化过程
2019-02-01 10:23:25在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。...(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取...在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为 “1”;其余7位1111001取反后为0000110;再加1,所以是10000111。 -
原码、反码、补码转换。short、int、long类型有无符号位输出
2017-10-31 13:52:29short、int、long类型有符号位输出和无符号位输出的数值问题 原码、反码、补码转换short、int、long类型有符号位输出和无符号位输出的数值问题
原码、反码、补码转换
系统:windows 32/windows 64
软件:Visual C++ 6.0#include<stdio.h> void main() { printf(" 类型 = 字节数\n"); printf(" sizeof(short) = %d\n",sizeof(short)); printf("sizeof(unsigned short) = %d\n",sizeof(unsigned short)); printf(" sizeof(int) = %d\n",sizeof(int)); printf(" sizeof(unsigned int) = %d\n",sizeof(unsigned int)); printf(" sizeof(long) = %d\n",sizeof(long)); printf(" sizeof(unsigned long) = %d\n",sizeof(unsigned long)); }
运行结果:
long类型为四个字节,取值范围为-2^31~2^31-1,即-2147483648~2147483647#include<stdio.h> void main() { long i = 2147483648; long _i = -2147483648; long maxi = 2147483649; long _maxi = -2147483649; long mini = 2147483647; long _mini = -2147483647; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 2147483647 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini); printf("-2147483647 = %o\t %d\t %u\t %x\n",_mini,_mini,_mini,_mini); printf(" 2147483648 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-2147483648 = %o\t %d\t %u\t %x\n",_i,_i,_i,_i); printf(" 2147483649 = %o\t %d\t %u\t %x\n",maxi,maxi,maxi,maxi); printf("-2147483649 = %o\t %d\t %u\t %x\n",_maxi,_maxi,_maxi,_maxi); }
运行结果:
解析:正数的原码与补码相同、负数的补码为模数减去负数的绝对值(即负数的原码取反加一【注意数据溢出】)
2147483647的二进制
原码:0111 1111 1111 1111 1111 1111 1111 1111
补码:0111 1111 1111 1111 1111 1111 1111 1111
十六进制:0x7FFF FFFF-2147483647的二进制
原码:0111 1111 1111 1111 1111 1111 1111 1111
反码:1000 0000 0000 0000 0000 0000 0000 0000
补码:1000 0000 0000 0000 0000 0000 0000 0001
十六进制:0x8000 00012147483648的二进制
原码:1000 0000 0000 0000 0000 0000 0000 0000
补码:1000 0000 0000 0000 0000 0000 0000 0000
十六进制:0x8000 0000-2147483648的二进制
原码:1000 0000 0000 0000 0000 0000 0000 0000
反码:0111 1111 1111 1111 1111 1111 1111 1111
补码:1000 0000 0000 0000 0000 0000 0000 0000
十六进制:0x8000 00002147483649的二进制
原码:1000 0000 0000 0000 0000 0000 0000 0001
补码:1000 0000 0000 0000 0000 0000 0000 0001
十六进制:0x8000 0001-2147483649的二进制
原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:0111 1111 1111 1111 1111 1111 1111 1110
补码:0111 1111 1111 1111 1111 1111 1111 1111
十六进制:0x7FFF FFFF2147483647的值等于-2147483649
2147483649的值等于-2147483647
2147483648的值等于-2147483648
因为2147483648是最大值,也是最小值。2147483649相当于从-2147483648加一进入到了负数那边(即-2147483648+1)。同理,-2147483649相当于从2147483648减一进入到正数那边(即2147483648-1)
unsigned long类型为四字节,取值范围为0~2^32-1,即0~4294967295#include<stdio.h> void main() { unsigned long i = 4294967295; unsigned long _i = -4294967295; unsigned long maxi = 4294967296; unsigned long _maxi = -4294967296; unsigned long mini = 4294967294; unsigned long _mini = -4294967294; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 4294967294 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini); printf("-4294967294 = %o\t\t\t %d\t %u\t\t %x\n",_mini,_mini,_mini,_mini); printf(" 4294967295 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-4294967295 = %o\t\t\t %d\t %u\t\t %x\n",_i,_i,_i,_i); printf(" 4294967296 = %o\t\t\t %d\t %u\t\t %x\n",maxi,maxi,maxi,maxi); printf("-4294967296 = %o\t\t\t %d\t %u\t\t %x\n",_maxi,_maxi,_maxi,_maxi); }
运行结果:
int类型为四个字节,取值范围为-2^31~2^31-1,即-2147483648~2147483647#include<stdio.h> void main() { int i = 2147483648; int _i = -2147483648; int maxi = 2147483649; int _maxi = -2147483649; int mini = 2147483647; int _mini = -2147483647; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 2147483647 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini); printf("-2147483647 = %o\t %d\t %u\t %x\n",_mini,_mini,_mini,_mini); printf(" 2147483648 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-2147483648 = %o\t %d\t %u\t %x\n",_i,_i,_i,_i); printf(" 2147483649 = %o\t %d\t %u\t %x\n",maxi,maxi,maxi,maxi); printf("-2147483649 = %o\t %d\t %u\t %x\n",_maxi,_maxi,_maxi,_maxi); }
运行结果:
unsigned int类型为四字节,取值范围为0~2^32-1,即0~4294967295#include<stdio.h> void main() { unsigned int i = 4294967295; unsigned int _i = -4294967295; unsigned int maxi = 4294967296; unsigned int _maxi = -4294967296; unsigned int mini = 4294967294; unsigned int _mini = -4294967294; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 4294967294 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini); printf("-4294967294 = %o\t\t\t %d\t %u\t\t %x\n",_mini,_mini,_mini,_mini); printf(" 4294967295 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-4294967295 = %o\t\t\t %d\t %u\t\t %x\n",_i,_i,_i,_i); printf(" 4294967296 = %o\t\t\t %d\t %u\t\t %x\n",maxi,maxi,maxi,maxi); printf("-4294967296 = %o\t\t\t %d\t %u\t\t %x\n",_maxi,_maxi,_maxi,_maxi); }
运行结果:
short类型为两个字节,取值范围为-2^15~2^15-1,即-32768~32767#include<stdio.h> void main() { short i = 32768; short _i = -32768; short maxi = 32769; short _maxi = -32769; short mini = 32767; short _mini = -32767; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 32767 = %o\t\t %d\t %u\t\t %x\n",mini,mini,mini,mini); printf("-32767 = %o\t %d\t %u\t %x\n",_mini,_mini,_mini,_mini); printf(" 32768 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-32768 = %o\t %d\t %u\t %x\n",_i,_i,_i,_i); printf(" 32769 = %o\t %d\t %u\t %x\n",maxi,maxi,maxi,maxi); printf("-32769 = %o\t\t %d\t %u\t\t %x\n",_maxi,_maxi,_maxi,_maxi); }
运行结果:
解析:
32767(-32769)的二进制
原码:0000 0000 0000 0000 0111 1111 1111 1111
补码:0000 0000 0000 0000 0111 1111 1111 1111
十六进制:0x0000 7FFF-32767(32769)的二进制
原码:0000 0000 0000 0000 0111 1111 1111 1111
反码:1111 1111 1111 1111 1000 0000 0000 0000
补码:1111 1111 1111 1111 1000 0000 0000 0001
十六进制:0xFFFF 800132768的二进制
原码:0000 0000 0000 0000 1000 0000 0000 0000
补码:0000 0000 0000 0000 1000 0000 0000 0000
十六进制:0x0000 8000-32768的二进制
原码:0000 0000 0000 0000 1000 0000 0000 0000
反码:1111 1111 1111 1111 0111 1111 1111 1111
补码:1111 1111 1111 1111 1000 0000 0000 0000
十六进制:0xFFFF 8000
unsigned short类型为两个字节,取值范围为0~2^16-1,即0~65535#include<stdio.h> void main() { unsigned short i = 65535; unsigned short _i = -65535; unsigned short maxi = 65536; unsigned short _maxi = -65536; unsigned short mini = 65534; unsigned short _mini = -65534; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 65534 = \t%o\t %d\t\t %u\t %x\n",mini,mini,mini,mini); printf("-65534 = \t%o\t %d\t\t %u\t %x\n",_mini,_mini,_mini,_mini); printf(" 65535 = \t%o\t %d\t\t %u\t %x\n",i,i,i,i); printf("-65535 = \t%o\t %d\t\t %u\t %x\n",_i,_i,_i,_i); printf(" 65536 = \t%o\t %d\t\t %u\t %x\n",maxi,maxi,maxi,maxi); printf("-65536 = \t%o\t %d\t\t %u\t %x\n",_maxi,_maxi,_maxi,_maxi); }
运行结果:
-
Java基础之 进制转换 补码 反码 原码
2019-03-24 11:28:53反码: 在原码的基础上符号为不变 逐位取反 原码:人类计算的二进制真值 正数原码=补码=反码 Integer.toBinaryString() 输出的结果是计算机内存中真正存储的形式(补码) 例如计算-11的补码: -11 原码:...(不知道为什么打印输出顺序有问题 所以我做了标记 方便阅读)
在Java中 整数类型 都是以补码的形式存储
补码: 反码 + 1
反码: 在原码的基础上符号为不变 逐位取反
原码:人类计算的二进制真值 正数原码=补码=反码
Integer.toBinaryString() 输出的结果是计算机内存中真正存储的形式(补码)
例如计算-11的补码:
-11 原码:1000 0000 0000 0000 0000 0000 0000 1011
-11的反码:1111 1111 1111 1111 1111 1111 1111 0100 (负数的原码 :符号为不变 其余各位依次取反)
-11的补码:1111 1111 1111 1111 1111 1111 1111 0101 (负数的补码 :在反码的基础上 加1 为补码)
-
有符号数的原码、补码、反码、移码的转化
2020-05-22 13:24:15原码、补码、反码、移码的转化(只介绍转换方法,不说明原理) 1、原码:也就是机器数(如果对机器数和真值不了解可以看我的另...例如:+1101的补码就是0,1101 负数: 数据位按位取反(意思就是除符号位外,其他数按位取反) -
反码,补码,原码
2018-10-08 08:21:00在Java里面,有些数据是用有符号数据表示法表示的,主要有原码,反码,补码。 计算机以补码形式表示数据。 机器码——原码——反码——补码 一. 机器数和真值 1、机器数一个数在计算机中的二进制表示形式,叫做这个数... -
原码 反码 补码的相互转换
2019-08-10 17:51:13原码 反码 补码的相互转换 原码 反码 补码的转换 还是...二进制中第一位是符号位,0表示正数,1表示负数。 以八位二进制数为例。 原码 十进制数正1的二进制原码 [+1]原 = 0000 0001 十进制数负1的二进制原码 [-1]原 ... -
39.原码、反码、补码的转换
2015-10-29 08:58:00正数的原码、反码、补码时一样的;负数的补码为原码除符号位取反加1,从补码转换为原码,有两种方式,第一...负数的原码+补码=2ˆN,N为包括符号位的位宽。 转载于:https://www.cnblogs.com/geekite/p/4919320.html... -
用java程序编写原码补码转换_java 原码、反码、补码
2021-03-08 23:36:49最高位表示符号,0为正,1为负来看看用原码表示的数在进行加减乘除运算是会有什么问题:十进制:1-1=1+(-1)=0原码:(0000 0001)-(0000 0001)=(0000 0001)+(-0000 0001)=(0000 0001)原+(1000 0001)原=(1000 0... -
原码,反码,补码【正反转换】
2021-03-01 17:11:46原码,反码,补码【正反转换】1. 原码、反码、补码 正逆转化方法1.0 前言1.1 正转方法1.2 反转方法2. 参考资料 ...原码除符号位外的位取反 补码 等于原码 反码+1 (即等于原码除符号位外取反,然后+1) -
信息存储 整数表示 原码 反码 补码 无符号数 有符号数 转换 扩展 截断
2020-04-27 00:59:21虚拟内存,地址,虚拟地址空间 程序对象:程序数据、指令和控制信息 16进制 字数据大小 字长 寻址和字节顺序 最小的地址 小端法和大端法 ...c语言位运算 &...无符号编码 ...无符号数编码的唯一性 函数B... -
符号数表示—原码 反码 补码
2015-07-24 17:03:16三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域... -
原码转补码
2014-11-08 18:56:30增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。这样一个数的8位原码表示中,第一位是符号位,剩余七位是数值的二进制表示。例如:-8的原码为... -
原码,反码与补码之间的转换简记
2013-11-22 03:48:00原码,反码和补码用于将二进制有符号数据的正负号也用二进制编码的方式来表示, ... 负数的反码为原码的符号位不变,其它位取反而得,负数的补码为原码的符号位不变,其它位取反加1而得. 以下是负数三种编码之间的转换... -
计算机中的位操作、补码、反码、原码
2016-06-14 22:47:18三种表示方法均有符号位和数值位两部分。 在计算机中,数值一律用补码来表示和存储。原因在于,使用补码可以将符号位和数值域同一处理;同时,加法和减法也可以统一处理。此外补码和原码相互转换,其运算过程是相同... -
原码、补码、反码、移码的转换关系
2020-11-26 18:00:17机器数:将机器“数字化”的数称为机器数。...2.补码:原码的符号位不变,其他位取反,末位加1,补码中的0只有一种表示形式。 3.反码:符号位除外,其他位取反. 4.移码:将补码的符号位取反可得到移码 ... -
学反码、补码、原码,取模,取余
2008-09-19 21:44:001、在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示... (2)负数的补码:符号位为1,其余位为该数绝对值的原 -
补码原码反码 移位和位操作运算 二进制
2020-04-01 09:56:49补码原码反码 正数的原码、反码和补码都相同。 负数原码和反码的相互转换: 符号位不变,数值位按位取反。...两个相应的二进制位中只要有一个为1,该位的结果值为1 ^ 按位异或 若参加运算的两个二进...