Java的原始类型里没有无符号类型,如果需要某个宽度的无符号类型,可以用>>>,这个是java的无符号右移操作符,或者使用下一个宽度的带符号类型来模拟,例如,需无符号的short,就用int来模拟:
int toUnsigned(short s) {
return s & 0xFFFF;
具体问题:
a = (argb[i] & 0xff000000) >> 24;
r = (argb[i] & 0xff0000) >> 16;
g = (argb[i] & 0xff00) >> 8;
b = (argb[i] & 0xff) >> 0;
在做颜色转换的代码中,就碰到了这个问题,前面的代码,因为最高位如果是1,那么经过argb[i] & 0xff000000计算,假如argb[i] = 0xf0000000, 那么0xf0000000经过移位运算就是0xfffffff0了,十进制值为-16, 因为右移的规则只记住一点:符号位不变,左边补上符号位。
换种说法就是:
带符号右移运算符用“>>”表示,是将运算符左边的运算对象,向右移动运算符右边指定的位数。如果是正数,在高位补零,如果是负数,则在高位补1。
所以本来应该是a = 0xf0, 十进制值为240, 最后的结果因为把这个值算错了。
解决这个问题的办法有两种:
1.使用下一个宽度的带符号类型来模拟
2.使用无符号右移运算符>>>
所以正确的写法是:
A = (argb[rgb_idx] & 0xff000000) >>> 24;
R = (argb[rgb_idx] & 0xff0000) >>> 16;
G = (argb[rgb_idx] & 0xff00) >>> 8;
B = (argb[rgb_idx] & 0xff) >>> 0;
java窄的整型转换成较宽的整型时是有符号扩展,但是如果它是char,那么不管它将要被提升成什么类型,都执行零扩展。java从宽的整型转窄的整型时,是直接截取最低位的字节。
参考:
https://www.cnblogs.com/jpit/p/9068429.html
https://blog.csdn.net/A_zhenzhen/article/details/78835327
网友评论