您好,我想添加2个short int并以short int形式获取结果。如果结果大于32767,则结果必须变为32767,如果结果小于-32768,则必须变为-32768。任何人都可以帮忙请给我吗?
.include "m32def.inc"
LDS R5,0x63
LDS R4,0x62
LDS R3,0x61
LDS R2,0x60
LDI R31,high(32767)
LDI R30,low(32767)
LDI R29,high(-32768)
LDI R28,low(-32768)
MOVW R17:R16,R5:R4
ADD R16,R2
ADC R17,R3
CP R16,R28
CPC R17,R29
BRGE loop1
CP R30,R16
CPC R31,R17
BRGE loop2
loop1: MOV R16,R30
MOV R17,R31
telos1: RJMP telos1
loop2: MOV R16,R28
MOV R17,R29
telos2: RJMP telos2
欢迎来到论坛。您的问题中遗漏了很多信息,可能对我们有用。对于您使用的是汇编语言而非C语言,我感到有些惊讶。
取决于您的处理器,short
可能不是16位值,但是正如您提到的32767和-32768一样,我认为是。
请原谅我,如果您已经知道这一点,但是您的问题使我认为您不知道。
16位有符号值可以采用-32768至32767的值,该值由二进制的1111 1111 1111 1111
至0111 1111 1111 1111
表示-前导位表示该值为负。
16位无符号可以采用0到65535(1111 1111 1111 1111
)的值,因为前导位没有表示负数。
我认为您的计算就像:
short a = 32767;
short b = 1;
short result = a + b;
当您在计算中使用signed值(short而不是unsigned short)时,这就是为什么大于32767的值变为负数的原因。 32767 +1 => -32768(0111 1111 1111 1111
+0000 0000 0000 0001
=> 1000 0000 0000 0000
理想情况下,在执行计算时,应确保接收数据类型足够大以容纳该值,因此,在这种情况下,如果32位更好,则应选择int
。
然后您可以针对32767和-32768的限制测试结果。