对于 无符整数,uint8,
这个 a 的取值范围是 0 - 2^8-1, 也就是 0 - 255, 恰好这就是 图像的 RGB 像素的范围。
比如 b00011011 = 2^0 + 2^1 + 2^4 + 2^5
对于 singed int,比如总共有 8 位,对于其能表示的范围是多少?
最开始的一位是符号位,符号位位 0,表示正数,符号位为 1 表示负数。
对于符号位为 0 的表示范围,为 0 - 2 ^7
对于符号位为 1 的表示范围,我们用补码表示,所谓补码,
比如说我们要表示一个 -3, 相当于我们要表示 - 3 + 2^8 = -3 + 256 = 253
而 253 在 uint8 上面的表示是 11111101,这就是 -3 在 int8 上面的编码表示。
在具体的操作上,由于 b11111111 = 2^8 -1,
(signed int 8) -3 = (unsigned int8) (-3 + 2^8) = (unsigned int8) (-3 + b11111111 +1)
我们把 3,也就是 00000011 按位取反,得到了b11111111 - b00000011, 再加上1 就得到了 -3 在signed int8 上面的编码。
也就是 -3:
1. 先看3 的编码: 00000011
2. 对之按位取反:11111100
3. 再加一:11111101
那么11111101 就是-3 在signed int8上面的编码表示。
from numpy import uint8 a = -3 b = uint8(6) c = uint8(a) + uint8(b) print('uint8 a = ', uint8(a)) print(c) print(type(c))
C:\Users\echok\Desktop\test.py:4: RuntimeWarning: overflow encountered in ubyte_scalars c = uint8(a) + uint8(b) 253 c type =, val = 3 [Finished in 0.5s]
from numpy import uint8 a = uint8(1) b = uint8(3) c = a - b print('c type = ', type(c), ', val = ', c)
C:\Users\echok\Desktop\test.py:4: RuntimeWarning: overflow encountered in ubyte_scalars c = a - b c type =, val = 254 [Finished in 0.5s]
from numpy import int8, uint8 a = int8(3) b = int8(-128) print('b type = ', type(b), ', val = ', b) c = a - b print('c type = ', type(c), ', val = ', c)
b type =, val = -128 C:\Users\echok\Desktop\test.py:5: RuntimeWarning: overflow encountered in byte_scalars c = a - b c type = , val = -125 [Finished in 0.4s]
bool int8add_valid(int8 x, int8 y) { int8 sum = x + y; int neg_over = x < 0 && y < 0 && sum > 0; int pos_over = x >0 && y > 0 && sum < 0; return ! neg_over && !pos_over; } bool uint8add_valid(uint8 x, uint8 y) { uint8 sum = x + y; if (sum < x || sum < y) return false; return true; } bool int8sub_valid(int8 x, int8 y) { int8 sub = x - y; return int8add_valid(x, -y); }