以 4 位为例,我的理解是:
有符号数原码:
0 000 ~ 0 111 +0 ~ +7 前面的 0 表示是正数。
1 000 ~ 1 111 -0 ~ -7 前面的 1 表示是负数。
因为 +0 和 -0 实际上是相等的,也就是说,0 用原码表示的话有两种方式,这样的编码虽然人看起来要好懂一些,但是对于计算机来讲,有三个坏处:
1,违反了唯一性
2,浪费了一个位模式(排列方式)。因为理论上来讲 4 位二进制能表示 2^4 = 16 个不同的数,但是这里只表示了 -7 ~ +7 15 个数。
3,-7 明明是小于 -0 的,但是如果不把最高位当作符号位来看的话,1000 要比 1111 小。
我着重讲一下第三点。因为我们最终的目标是让符号也能够参与运算,也就是说,任何两个有符号数比较大小的时候,我们希望只需要减一下就可以了,因此原码的 1000 和 1111 它的顺序是反的,很不利于运算。
-128 在原码里是无法表示的。
基于以上三个原因,就引进了补码,在介绍补码之前,我先介绍一下反码:
正数的反码就是原码:
0 000 ~ 0 111 +0 ~ +7 反码
负数的反码就是对原码除符号位以外的其余各位进行取反:
1 111 ~ 1 000 -0 ~ -7 反码
这么做的好处是什么呢?好处是,解决了上面三个问题中的第三个问题。
但是另外两个问题还是没有解决。
下面引入的补码,就是为了解决另外两个问题。
补码:
补码的规则是:正数的补码和原码、反码形式相同。
负数的补码,等于反码 + 1,加 1 的时候,符号位也参与运算,溢出位被丢弃,不影响结果。
也就是说:
0 000 ~ 0 111 +0 ~ +7 补码
(1)0 000 ~ 1 001 -0 ~ -7 补码。
注意反码的 -0 也就是 1111 加了 1 之后,符号位产生了进位,溢出了,溢出之后,剩下的部分正好和 +0 一样了。
也就是说,第一个问题也解决了。
第一个问题解决了,那么就剩下第二个问题了,
因为从 -0 到 -7 依次是:
-7: 1 001
-6: 1 010
-5: 1 011
-4: 1 100
-3: 1 101
-2: 1 110
-1: 1 111
-0: 0 000
+1: 0 001
+2: 0 010
...
...
...
也就是说,还剩下 1 000 这个位模式是没用的,
因此就可以用它来表示其它的数。但是到底应该用它来表示 +128 好呢?还是 -128 好呢?
观察上面的序列,你会发现,如果溢出是正常的话,
上面的数列正好是连续的,
而 1 000 比 1 001 还要小 1,因此用来表示 -128 是合理的。加 1 之后正好等于 -127。
因此就用 1 000 来表示 -128 了。
分享到:
相关推荐
int 数据类型是32位、有符号的以二进制补码表示的整数; 最小值是-2,147,483,648(-2^31); 最大值是2,147,483,647(2^31 - 1); long 数据类型是 64 位、有符号的以二进制补码表示的整数; 最小值是-9,223,372,...
C语言06-外中断INT0-INT1-INT2-INT3- INT4测试(STC32G-DEMO-CODE-220311kw)C语言06-外中断INT0-INT1-INT2-INT3- INT4测试(STC32G-DEMO-CODE-220311kw)C语言06-外中断INT0-INT1-INT2-INT3- INT4测试(STC32G-DEMO...
使用int 最大值,最小值,注意啦使用int 最大值,最小值,注意啦
Chatglm2-6b-int4资源文件
char lc(const char ch); char uc(const char ch); int max_int(); int min_int();
c语言为什么int型的取址范围为-2的15次方到2的15次方减1
C51单片机-外中断INT0-INT1-INT2-INT3- INT4测试
简单易懂,从大佬那里搬运来的,有一个int数组{1,3,5,-2,4,6},要求获取:最大值、最小值、元素和、平均值
fp32-fp16-int8-entropy-minmax-simple -yolov5
从 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer。 smallint 从 -2^15 (-32,768) 到 2^
int?i?=?3;?????//?注意i,j的数据类型, unsigned?char?j?=?3;????//?不同的数据类型延时有很大不同 //-----------------各种精确延时语句----------------------------------- while(?(i--)!=1?);??????//?延时...
为什么? int n; if (n == 10) // 第一种判断方式 if (10 == n) // 第二种判断方式 如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了= -------------------------------------------------...
智力 返回指定整数类型的最小值。...int32 : 有符号的 32 位整数 uint32 : 无符号 32 位整数 如果未提供整数type ,则该函数返回最小的有符号 32 位整数。 intmin ( ) === intmin ( 'int32' ) ;
由于计算机运算是有模运算,数据范围的表示有一定限制,如整型int(C++中int 与long相同)表达范围是(-2^31~2^31-1),unsigned long(无符号整数)是(0~2^32-1),都约为几十亿.如果采用实数型,则能保存最大的double只能提供...
typedef struct int100{ //100位长整数,以补码存储 __int64 low; //低0 ... 2^51-1位 51 .. 63 位置空,作溢出时保留数据用 __int64 top; //高0 ... 2^61-1 //__int64 sign; //符号位在...
由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参考: 一、强制类型转换 [java] long ll = 300000; int ...
4-2 程序举例-求最小值 任务需求 输入3个数,利用函数的嵌套调用,求出这3个数中的最小值。 任务分析 ① 首先定义函数min2( ),求出2个整数中的最小值。 ② 然后定义函数min3( ),求出3个整数中的最小值(即由两次...
int 在内存中占四个字节 范围为 2^31 (2^31 1) long在内存中占四个字节 范围为 2^31 2^31 1 无符号型:最高位不表示符号位 unsigned short 在内存中占两个字节 范围为0 2^16 1 unsigned int 在内存中占四个...
在进行运算时,以表达式中最长类型为主,将其他类型位据均转换成该类型,如: (1)若运算数中有double型或float型,则其他类型数据均转换成double类型进行运算。 (2)若运算数中最长的类型为long型.则其他类型数均...
用牛顿迭代法求下面方程再1.5附近的根:2x ^ 3 – 4x ^ 2 +3x -6=0. 首先介绍一下牛顿迭代法: #include #include int main( ) { float m,n,i=1.5,t; while(1) { m=2*i*i*i-4*i*i+3*i-6; n=6*i*i-8*i+3; t...