算术移位运算时数据类型提升带来的问题
2022-11-15. 当年基础知识学过的,多年后再看恍如隔世般,那就再学一遍:算术(有符号)和逻辑的(无符号)的移位。
背景知识
两类位移运算:左移和右移。
类型:逻辑的或者算术的。
左移比较简单:右边补0。
右移:算术的补位是根据符号位确定的,逻辑的补0即可。
负数的二进制:原码-->取反-->加1,负数在计算机中以补码形式存在。
正数的二进制:略。
负数的补码
int32类型,值-255
原码:
1000 0000 0000 0000 0000 0000 1111 1111
取反:
1111 1111 1111 1111 1111 1111 0000 0000 《符号位不取反》
+1:
1111 1111 1111 1111 1111 1111 0000 0001 《最终的内存中的形式》
-255的算术右移1位
1111 1111 1111 1111 1111 1111 1000 0000 1《丢弃掉的1》
首位符号位保持不变,仍为1,末位1被丢掉;
1111 1111 1111 1111 1111 1111 1000 0000 反推10进制表示:
-1操作:
1111 1111 1111 1111 1111 1111 0111 1111
取反:
1000 0000 0000 0000 0000 0000 1000 0000 10进制为= -128