作者:会长大的幸福7007 | 来源:互联网 | 2022-11-28 17:08
我尝试用Python重写下面的小C程序,但我得到了不同的输出.
C版:
#include
int main()
{
unsigned char data = 0x00;
unsigned char i;
unsigned char bit = 0x01;
unsigned char parity = 1;
unsigned char value = 0x1c;
for (i = 0; i <8; i++)
{
data = data | bit;
bit = bit <<1;
parity = parity ^ (data & 0x01);
}
printf("data: %d bit: %d parity: %d\n", data, bit, parity);
return 0;
}
Python版本:
data = 0
bit = 1
parity = 1
value = int('1c', 16)
for i in range(8):
data = data | bit
bit = bit <<1
parity = parity ^ (data & 1)
print('data: {0} bit: {1} parity: {2}'.format(data, bit, parity))
产出是:
C版
> $ ./test
data: 255 bit: 0 parity: 1
Python版本
> $ python3 test.py
data: 255 bit: 256 parity: 1
我在Python按位操作上缺少什么?
1> Rory Daulton..:
如您所见,输出的唯一区别是变量的值bit
.
在C程序中,变量bit
声明为unsigned char
.这意味着它只需要0
通过值255
.bit
代码中的最后一个操作是
bit = bit <<1
在最后一次执行该行之前,bit
是128
.在那一行之后,它"试图"成为256
但不适合于unsigned char
.所以溢出发生,没有被你的程序标记,bit
变成了0
.
在Python程序中,变量bit
只是一个整数,int
没有最大大小.所以没有溢出,bit
确实成了256
.
有几种方法可以克服Python中的这种差异.您可以bit
通过改为使用来强制保持在所需的范围内
bit = (bit <<1) % 256
也许
bit = (bit <<1) & 255
您可以改为使其bit
等效于unsigned char
变量.正如评论所说ctypes
,我相信你可以使用该模块.你也可以使用numpy
(我对此更熟悉).