Python代码不像C++那样工作

rdrgkggo  于 2023-04-08  发布在  Python
关注(0)|答案(1)|浏览(173)

此问题已在此处有答案

How does the modulo (%) operator work on negative numbers in Python?(12个回答)
7天前关闭
如何获得相同的值 在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代码更好的方法了:)

lx0bsm1f

lx0bsm1f1#

Why does C++ output negative numbers when using modulo?中所引用
ISO/IEC 14882:2003(E)- 5.6乘法运算符:
二元/运算符产生商,二元%运算符产生第一个表达式除以第二个表达式的余数。如果/或%的第二个操作数为零,则行为未定义;否则(a/B)*b + a%b等于a。如果两个操作数都是非负的,则余数是非负的;如果不是,则余数的符号是实现定义的
这里C++编译器计算

-32768 % 3000  = -2768

然后 Package 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。

相关问题