RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 839844
Accepted
user2173645
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 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. 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;
    }
    
    • 9
  2. 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;
    }
    
    • 2
  3. 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;
    } 
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5