返回信息流RT,最近在做图像处理问题,对于自己创建的numpy数组需要转化为uint8类型,然后使用opencv进行显示,但是由于自己粗心遇到了一个小bug,如下描述。
a = np.array(171) # a的类型为int32, 类型为float64时也会出同样错误
b = a.astype("int8") # 这里是int8,类型为uint8一切正常
print(a,b) # 出现的bug为 a数值是171,而b为-85
想询问一下有没有大佬知道怎么回事,如果能顺便解析一波类型转换的原理是最好的了[ema23]
这是一条镜像帖。来源:北邮人论坛 / python / #23267同步于 2019/1/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
python中如何进行数据类型转换?
cheng1997
2019/1/22镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这个是numpy的范围吧,去看numpy文档。
哇,numpy的文档看不懂 https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ndarray.astype.html
能问一下,为什么要减两个128吗?没看懂。。
【 在 lizhe123456 的大作中提到: 】
: 171 - 128 -128=-85,也就是说,int8只能表示 -128~127的数。
我也知道不一样,当时一个小错误,现在在思考为什么会出现这个bug..[ema1]
【 在 qcts 的大作中提到: 】
: int8和uint8是不一样的啊……
171 换成二进制就是 00....0010101011
强行截断为int8就是 10101011
有符号数的最高位为符号位 存的都是补码 所以输出时需要转为原码 因为是负数所以各位取反再+1 即11010101 == -(64+16+4+1) == -85
无符号数没有符号位 所以没区别
如果不想了解这么细 要学会计算范围的方法 比如此例中就是int8就是[-2^7,2^7-1],即[-128,127] uint8就是[0, 2^8-1],即[0,255]
明显前者越界了
这个如果没记错应该是本科时计算机组成原理学的
因为你可以试一下,128表示为int8变成-128,129为-127,这样就相当于减去两个128。当然,正确的解释应该从补码的角度考虑。
【 在 cheng1997 (长生在世) 的大作中提到: 】
: 能问一下,为什么要减两个128吗?没看懂。。