user2173645 Asked:2020-06-09 18:39:08 +0000 UTC2020-06-09 18:39:08 +0000 UTC 2020-06-09 18:39:08 +0000 UTC 将除法规则更改为 0 772 需要改变什么,或者是否可以通过钩子(拦截)来改变划分规则?在我的任务中,将数字除以 0 应该得到 0。我有兴趣更改规定的算法 c++ 3 个回答 Voted Best Answer AR Hovsepyan 2020-06-10T01:43:21Z2020-06-10T01:43:21Z #include <iostream> using namespace std; class Int_type { int k; public: Int_type(int i = 0) : k(i) {} Int_type& operator ++() { ++k; return *this; } Int_type operator ++(int) { Int_type t; ++(t.k); return t; } Int_type& operator =(const int& i) { k = i; return *this; } Int_type& operator /=(const int& i) { k = i ? k / i : 0; return *this;} operator int() const { return k; } }; inline Int_type operator /(const Int_type& n, const int& i) { Int_type t = n; t /= i; return t; } 您可以使用类对象而不是 int 对象并除以零 int main() { Int_type i; i = 19; ++i; cout << i << endl << i/ 2 << endl << i - 2 <<endl << i * 2 << endl << i/0; return 0; } user2173645 2020-06-14T14:30:50Z2020-06-14T14:30:50Z 非常感谢您的回答。然而,由于长时间没有答案,我通过异常过滤器想出了自己的解决方案。应该适用于 32 位应用程序中的所有整数。在这里,当引发异常时,过滤器会检查操作类型并将寄存器中的零替换为一。然后跳转到下一条指令 #include "stdafx.h" #include <Windows.h> #include <iostream> using namespace std; LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo) { cout << "Exception code: 0x" << hex << (int)pExceptionInfo->ExceptionRecord->ExceptionCode << " Exception address: 0x" << (DWORD)pExceptionInfo->ContextRecord->Eip << endl; if ((int)pExceptionInfo->ExceptionRecord->ExceptionCode == 0xc0000094) { DWORD presentEIP = (DWORD)pExceptionInfo->ContextRecord->Eip; byte EIPvalue[2]; EIPvalue[0] = *(byte*)presentEIP; EIPvalue[1] = *(byte*)(presentEIP + 0x1); if (EIPvalue[0] == 0xF7 && EIPvalue[1] == 0xF9) { pExceptionInfo->ContextRecord->Ecx = 1; cout << "Forced ECX to 1 [1]" << endl; } else if (EIPvalue[0] == 0xF7 && EIPvalue[1] == 0x7D) { _asm add DWORD PTR SS : [EBP - 8], 1; pExceptionInfo->ContextRecord->Eip += 3; cout << "Forced ECX to 1 [2]" << endl; } else return EXCEPTION_CONTINUE_SEARCH; return EXCEPTION_CONTINUE_EXECUTION; } return EXCEPTION_CONTINUE_SEARCH; } int f(int x, int y, int z) { return 2 + x / (2 / (y - z)); } int main() { AddVectoredExceptionHandler(true, (PVECTORED_EXCEPTION_HANDLER)ExceptionFilter); // Registers our vectored exception handler which is going to catch the exceptions thrown. int res = f(2, 3, 3); //F7F9 cout << "Result: " << dec << res << endl; getchar(); int zero = 1 * 0;//F77D F8 int i; i = 1 + 5 / zero; cout << "Result: " << dec << i << endl; getchar(); return 0; } user417504 2021-11-23T07:38:53Z2021-11-23T07:38:53Z 这就是我所做的并且有效: #include <iostream> using namespace std; class IntType { int k; public: IntType(int i = 0) : k(i) {} IntType& operator ++() { ++k; return *this; } IntType operator ++(int) { IntType t; ++(t.k); return t; } IntType& operator =(const int& i) { k = i; return *this; } IntType& operator /=(const int& i) { k = i ? k / i : 0; return *this;} operator int() const { return k; } }; inline IntType operator /(const IntType& n, const int& i) { IntType t = n; t /= i; return t; }
您可以使用类对象而不是 int 对象并除以零
非常感谢您的回答。然而,由于长时间没有答案,我通过异常过滤器想出了自己的解决方案。应该适用于 32 位应用程序中的所有整数。在这里,当引发异常时,过滤器会检查操作类型并将寄存器中的零替换为一。然后跳转到下一条指令
这就是我所做的并且有效: