Python 代码不像在 C++ 中那样工作 [重复]

问题描述 投票:0回答:1

如何在Python中获取与C++中相同的值?

CPP代码

#include <bitset>
#include <iostream>

using namespace std;

int main() {
    short int divider = -32768;
    auto divider_bin_str = bitset<16>(divider).to_string();
    cout << "divider: " << divider << " " << divider_bin_str << endl; // divider: -32768 1000000000000000

    char division = static_cast<char>(divider % 3000);
    string division_bin_str = bitset<8>(division).to_string();
    cout << "division: " << (int) division << " " << division_bin_str << endl; // division: 48 00110000
}

Python代码

divider = -32768
print(f'divider: {divider} {bin(divider)}')  # divider: -32768 -0b1000000000000000
division = divider % 3000

print(f'division: {division} {bin(division)}')  # division: 232 0b11101000

我想不出比从 Python 调用 C 代码更好的事情了 :)

python c++ modulo signed
1个回答
1
投票

如引用为什么C++在使用模时输出负数?

ISO/IEC 14882:2003(E) - 5.6 乘法运算符:

二进制 / 运算符产生商,二进制 % 运算符产生第一个表达式除以第二个表达式的余数。如果 / 或 % 的第二个操作数为零,则行为未定义;否则 (a/b)*b + a%b 等于 a。如果两个操作数都是非负的,则余数是非负的; 如果不是,余数的符号是实现定义的

所以你的 C++ 编译器在这里计算

-32768 % 3000  = -2768

然后包装 char 类型(有符号/无符号?再次定义实现)

-2768 wrapped around 256 = 48 (< 127 so no issue here)

相应的 python 代码(在这种情况下 python 不会返回负结果,按设计)是:

divider = -32768

division = (divider % 3000)
if divider < 0:
    division -= 3000

result = division % 256

if result > 127:  # if signed char (no difference in that case)
    result = 256-result

print(division % 256)

版画

48

鉴于实现定义的方面,我建议您针对大量测试用例测试此 C++ 和 python 代码,例如,当转换为 char 时值 > 127,如果您更改编译器选项或编译器本身。

© www.soinside.com 2019 - 2024. All rights reserved.