对于 无符整数,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);
}