首页 > 编程知识 正文

有符号数和无符号数范围,有符号数和无符号数的定义

时间:2023-05-05 22:47:26 阅读:190829 作者:1879

有符号数和无符号数详解 1. 通过例子看问题2. 有符号数和无符号数2.1 什么是无符号数 ?2.2 什么是有符号数 ?2.3 有符号数和无符号数的区别 3. 原码、反码、补码3.1 背景3.2 原码、反码、补码3.2.1 什么是机器数?3.2.2 什么是真值?3.2.3 原码、反码、补码 4. -1 和 0xFFFFFFFF问题 5. 计算机为什么采用补码来进行运算参考
有符号数和无符号数详解(2)补码详解
https://blog.csdn.net/lqy971966/article/details/106130830

1. 通过例子看问题 unsigned int uint;int i = -1;uint = i;printf("%x %u %dn", uint, uint, uint);printf("%x %u %dn", i, i, i);//输出ffffffff 4294967295 -1ffffffff 4294967295 -1/*因为 根据打印格式打印的%d 有符号32位整数%u 无符号32位整数%lld 有符号64位整数*/uint = 0xffffffff;i = uint;printf("%x %dn", uint, i);//输出ffffffff -1int j = -1;printf("%xn", (~j));//输出0int k = 1;printf("%xn", (~k);//输出0xfffffffechar c = 1;printf("%dn", (~c));//输出-2因为: char c = 1;printf("%xn", c); //1printf("%xn", (~c)); //fffffffeprintf("%dn", (~c));//-2

如果以上例子看的没问题,那你就不用往下看了!哈哈~~

2. 有符号数和无符号数 2.1 什么是无符号数 ?

无符号数(unsigned number) 是相对于有符号数而言的,
指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。
如: 32位操作系统中
(普及概念:

8位的CPU,一次只能处理一个8位的“数据”或者一个8位的"指令"。比如’00001101’。

32位CPU一次能处理32位的数据或者一个32位的指令。
如 00000001 00000011 00000111 00001111)

unsigned int iMinNum = 0;
unsigned int iMaxNum = 0xffffffff;
printf(“iMinNum = %u, iMaxNum = %un”, iMinNum, iMaxNum);
结果:
–》iMinNum = 0, iMaxNum = 4294967295

其中,无符号数32位的取值范围是: 0~4294967295
注意:%u 无符号32位整数

2.2 什么是有符号数 ?

有符号数(signed number) 和无符号数基本相同,不同的是:一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。
如: 32位操作系统中

int iMinNum = 0x80000000; //1000 0000 0000 0000 0000 0000 0000 0000 int iMaxNum = 0x7fffffff; //0111 1111 1111 1111 1111 1111 1111 1111printf("iMinNum = %d, iMaxNum = %dn", iMinNum, iMaxNum);结果:iMinNum = -2147483648, iMaxNum = 2147483647

其中,有符号数32位的取值范围是: -2147483648~2147483647
二进制表示:
最小值: 1000 0000 0000 0000 0000 0000 0000 0000
最大值: 0111 1111 1111 1111 1111 1111 1111 1111
因为: 在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1
注意:%d 有符号32位整数

2.3 有符号数和无符号数的区别 有符号数和无符号数的区别:
在32位编译器中,有符号数的二进制位最高位表示-2^ 31,而无符号数的二进制位最高位表示的是2^31无论它是有符号数还是无符号数,它的二进制表示肯定都是唯一的
(不可能在有符号形式下有一种表示,在无符号形式下也有一种表示) 3. 原码、反码、补码 3.1 背景 负数表示问题
在数学中,任意基数的负数都在最前面加上“−”符号来表示。
在计算机硬件中,数字都以无符号的二进制形式表示。
但是负数如何用二进制表示呢?解决:
当前通过:原码、反码、补码,用于扩展二进制数字系统,来表示有符号数。 3.2 原码、反码、补码 3.2.1 什么是机器数?

机器数就是 数在计算机中的二进制表示形式。
机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。
例如:

计算机字长为8位,则:
十进制数+3 ,转换成二进制00000011,
十进制数-3 ,转换成二进制10000011。
那么,这里的00000011和10000011就是机器数。 3.2.2 什么是真值?

真值就是真正的值。
因为二进制数的最高位是符号位,所以机器数的形式值就不等于真正的数值。
为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
即第一位用±表示数字的正负,其余为二进制数。
例如:
0000 0001的真值= +000 0001,1000 0001的真值= –000 0001。

3.2.3 原码、反码、补码

原码:
就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

例如: 1 的源码 0000...0001 -1的原码:1,000...0001

反码:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

例如: 1的反码还是1 如-1的补码为1,111...1110

补码:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1

例如: 1的补码还是1 -1的补码为1,111...111 (这就解释了无符号-1 = 1111…1111 = 4294967295)

因为: 在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1

4. -1 和 0xFFFFFFFF问题

上面的补码就解释了 -1 和 0xFFFFFFFF的问题
有符号 -1 的二进制表示就是以补码形式表示,即: 0xffffffff ( =2 ^ 31 +2 ^ 30+…+2 ^ 1+2 ^ 0=- 2 ^ 31+2 ^ 31-1=-1)

unsigned (-1)表示无符号整数的最大值 即: 4294967295(二进制全1)
因此,unsigned(-1)=1,111…111(共32个1)。表示unsigned的最大值。
也就是0xFFFFFFFF

5. 计算机为什么采用补码来进行运算

https://blog.csdn.net/m0_37955444/article/details/79848485

有符号数和无符号数详解(2)补码详解
https://blog.csdn.net/lqy971966/article/details/106130830

参考

https://blog.csdn.net/qq_28114615/article/details/85884280
https://blog.csdn.net/weixin_38825407/article/details/86297969
https://blog.csdn.net/weixin_40825228/article/details/81136554
https://blog.csdn.net/baidu_33725271/article/details/69801949
https://www.cnblogs.com/Wubg/p/5813595.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。