有符号和无符号
有符号和无符号
1. 有符号和无符号
说到运算,我们首先介绍一下无符号和有符号数在数字电路的二进制表示方法,MSB(Most Significant Bit)代表最高位,LSB(Least Significant Bit)代表最低位。
在二进制运算里面,无符号数即所有bits位都代码实际的数据内容,dec代表十进制,计算公式:
Value(dec)=(2^MSB)*bit(MSB)+(2^MSB-1)*bit(MSB-1) + ....+ (2^0)*bit0
有符号数通常会把MSB当作符号位,0代表正数,1代表负数,其余MSB-1 ~ 0 当作实际数据内容的补码,当符号位为0,实际值=补码值,当符号位为1,实际值=2^符号位bit位-补码值,计算公式:
Value(dec) = (MSB == 1'b0) ?
(2^MSB-1)*bit(MSB-1) + ....+ (2^0)*bit0 :
-1* ((2^MSB)*bit(MSB)- ((2^MSB-1)*bit(MSB-1) + ....+ (2^0)*bit0))
以3bits的二进制数为例,示意分别代表有符号数和无符号数的值:
二进制 十进制无符号数 十进制有符号数
bit2 bit1 bit0
0 0 0 (2^2)*0+(2^1)*0+(2^0)*0 = 0 (2^1)*0+(2^0)*0 = 0
0 0 1 (2^2)*0+(2^1)*0+(2^0)*1 = 1 (2^1)*0+(2^0)*1 = 1
0 1 0 (2^2)*0+(2^1)*1+(2^0)*0 = 2 (2^1)*1+(2^0)*0 = 2
0 1 1 (2^2)*0+(2^1)*1+(2^0)*1 = 3 (2^1)*1+(2^0)*1 = 3
1 0 0 (2^2)*1+(2^1)*0+(2^0)*0 = 4 -1*((2^2)*1-((2^1)*0+(2^0)*0)) = -4
1 0 1 (2^2)*1+(2^1)*0+(2^0)*1 = 5 -1*((2^2)*1-((2^1)*0+(2^0)*1)) = -3
1 1 0 (2^2)*1+(2^1)*1+(2^0)*0 = 6 -1*((2^2)*1-((2^1)*1+(2^0)*0)) = -2
1 1 1 (2^2)*1+(2^1)*1+(2^0)*1 = 7 -1*((2^2)*1-((2^1)*1+(2^0)*1)) = -1
小结一下,对于一个3bits的二级制数,如果代表无符号数,则表示范围为0~7, 如果表示有符号数,则表示范围为-4~3,即对于相同位宽的二进制数据,如果是无符号数,则能够表示范围为0~(2^MSB)-1, 如果是有符号数,则范围为-2^(MSB-1) ~ (2^(MSB-1)) -1, 由此可见,无符号数的范围是非对称的,即最小的复数值绝对值不等于最大整数的绝对值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)