如何在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 代码更好的事情了 :)
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,如果您更改编译器选项或编译器本身。