参考链接:https://blog.csdn.net/qq_38608897/article/details/103966054?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.no_search_link&spm=1001.2101.3001.4242
一、无符号数
无符号数二进制的乘除,就相当于左移或者右移了 2的几次方倍(如下图)
无符号数加法是进位,减法是借位;(进/借最高位)
例如:
1的补码是 0000 0001
2的补码是 0000 0010
-2的补码是1111 1110
那么1-2=1+(-2)= -1(负数)
0000 0001 + 1111 1110 = 1111 1111(255即为计算机的真实值)
【注意】无符号数小数减大数,结果出现负数,但是无符号数本身取值范围是≥0的,所以只能是其补码运算结果输出值为真值。
其中小数减大数,可以化作小数加负数,还是按照有符号数先转换成补码进行运算;
【TRUE】无符号数小数减大数(正常逻辑结果是负数),先转换成各自补码,其补码运算结果即为无符号相减运算的真值
二、有符号数
有符号数运算才涉及原码、反码、补码
【注意】0的原码、反码表示不唯一才引入的补码进行运算;
【TRUE】计算机的有符号数运算过程就是将参加运算的二进制数转换成其对应的补码,然后用其对应补码进行运算,其中用补码计算得出的运算结果如果是正数即为真值,如果是负数,则需将其补码运算结果作为原码对其再求补码得出即为真值;
例1:
1的补码是 0000 0001
2的补码是 0000 0010
-2的补码是1111 1110
那么1-2=1+(-2)= -1(负数)
0000 0001 + 1111 1110 = 1111 1111
而-1的补码是 1111 1111(再对1111 1111求其补码得出:1000 0001(真值));
1+1=2(正数)
1的补码0000 0001 + 0000 0001 = 0000 0010;
例2:
-52 + 116 = 64
-52的补码是1100 1100
116的补码是0111 0100
得出补码运算结果是:1 0100 0000(最高位溢出)
也就是0100 0000(正数即为真值:64);
参考:
https://blog.csdn.net/qq_34888036/article/details/80870936
https://blog.csdn.net/ziqi5543/article/details/108199896
【TRUE】无符号类型/有符号类型变量内存空间存放的都是补码,但是无符号类型输出的时候直接拿补码作为显示,而有符号数是按照求真值的方式(补码转换为原码)再进行显示;
【TRUE】实践证明可见,在32位MCU中,变量a和b定义的类型(位数u8、u16、u32)不一样结果也会不同。在实际做减法判断时最好将其赋值给变量c,然后再做判断,防止出现异常。在一些SDK中已经发现类似错误,在这提醒大家要格外注意。