70,020
社区成员




C traps and pitfalls [quote=引用 7 楼 skyliuxu 的回复:] 从哪看的“无符号算术运算 没有所谓的“溢出”-说 :所有的无符号运算都是以2的n次方为模,这里的n是结果中的位数”?
C traps and pitfalls 从哪看的“无符号算术运算 没有所谓的“溢出”-说 :所有的无符号运算都是以2的n次方为模,这里的n是结果中的位数”?
从哪看的“无符号算术运算 没有所谓的“溢出”-说 :所有的无符号运算都是以2的n次方为模,这里的n是结果中的位数”?
//有符号整形a和b,如何判断a+b是否溢出
#include <stdio.h>
int ifo_add(int a,int b) {
__asm {
mov eax,a
add eax,b
jo overflowed
xor eax,eax
jmp no_overflowed
overflowed:
mov eax,1
no_overflowed:
}
}
int main() {
int a,b;
a= 1;b= 2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a= -1;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a= 2147483647;b= 1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a=-2147483647;b=-1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a=-2147483647;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
}
// 1+( 2) 0
// -1+(-2) 0
// 2147483647+( 1) 1
//-2147483647+(-1) 0
//-2147483647+(-2) 1
//无符号整形a和b,如何判断a+b是否溢出
#pragma warning(disable:4035)
#include <stdio.h>
int ifo_addu(unsigned int a,unsigned int b) {
__asm {
mov eax,a
add eax,b
jo overflowed
xor eax,eax
jmp no_overflowed
overflowed:
mov eax,1
no_overflowed:
}
}
int ifc_addu(unsigned int a,unsigned int b) {
__asm {
mov eax,a
add eax,b
jc carried
xor eax,eax
jmp no_carried
carried:
mov eax,1
no_carried:
}
}
int main() {
unsigned int a,b;
a= 1u;b= 2u;printf("%11u+(%2u) %d\n",a,b,ifo_addu(a,b));
a= 4294967295u;b= 1u;printf("%11u+(%2u) %d\n",a,b,ifo_addu(a,b));
a= 1u;b= 2u;printf("%11u+(%2u) %d\n",a,b,ifc_addu(a,b));
a= 4294967295u;b= 1u;printf("%11u+(%2u) %d\n",a,b,ifc_addu(a,b));
return 0;
}
// 1+( 2) 0
// 4294967295+( 1) 0
// 1+( 2) 0
// 4294967295+( 1) 1
//