无符号数相减溢出

u16 a=190;

u16 b=1020;

u16 c=0;

c=a-b;

c=0xfcc2;

单片机采用补码运算,需要程序员认为识别是有符号数还是无符号数。通过最高bit判断。

//相差不大取上一次的值

if(Fluor_Value_100x_backup!=Fluor_Value_100x)

{

                //用减法处理会有溢出情况                

if((Fluor_Value_100x_backup>(50+Fluor_Value_100x))||(Fluor_Value_100x>(Fluor_Value_100x_backup+50)))
Fluor_Value_100x_backup=Fluor_Value_100x;
else
Fluor_Value_100x=Fluor_Value_100x_backup;
}

在计算机系统中,无符号整数相减的运算规则和溢出处理机制是理解底层数据操作的重要基础。无符号整数的运算在计算机中通常以补码形式进行,即便操作数本身是以无符号形式表示的,其底层处理仍然遵循补码的规则。 ### 无符号整数相减的运算规则 无符号整数的减法本质上是通过加法器实现的。计算机将减法转换为加法操作,即通过将减数取补码后与被减数相加来完成减法运算。例如,表达式 `a - b` 在计算机中被转换为 `a + (-b)`,其中 `-b` 是 `b` 的补码表示[^1]。 在无符号整数的减法中,如果 `a >= b`,则结果为非负数,且可以直接表示为无符号整数。但如果 `a < b`,则结果应为负数,但由于无符号整数无法表示负数,因此结果会表现为一个非常大的正数,这实际上是溢出的表现。 ### 溢出处理机制 在无符号整数的减法中,溢出(或称为下溢)表现为结果的模运算。例如,在 8 位无符号整数运算中,`0 - 1` 的结果会表现为 `255`,因为 8 位无符号整数的取值范围是 `0~255`,而减法操作的结果在模 256 的意义下是正确的[^2]。 这种溢出行为在底层硬件中通常由状态寄存器中的标志位(如进位标志 CF)来指示。在减法操作中,如果发生下溢,CF 会被置为 1,表示结果超出了无符号整数的表示范围。 ### 计算机底层原理 计算机的运算器负责执行基本的算术和逻辑操作。在执行无符号整数减法时,运算器会使用补码表示法进行计算,并通过标志位来指示溢出情况。控制器会根据这些标志位的状态来决定是否需要采取额外的处理措施,例如触发异常或调整程序流程。 在硬件层面,减法操作通常通过一个加法器和一个补码生成器来实现。具体来说,减数会被转换为其补码形式,然后与被减数相加。如果结果超出无符号整数的表示范围,则通过 CF 标志位进行记录[^3]。 ### 示例代码 以下是一个简单的 C 语言示例,展示了无符号整数相减的行为: ```c #include <stdio.h> int main() { unsigned char a = 0; unsigned char b = 1; unsigned char result = a - b; printf("Result: %u\n", result); // 输出结果为 255(在 8 位系统中) return 0; } ``` 在这个示例中,尽管 `a < b`,但由于 `result` 是无符号字符类型,其结果会表现为 `255`,而不是负数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值