算术移位运算时数据类型提升带来的问题

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

 

posted on 2013-07-25 12:49  益而不损  阅读(307)  评论(0编辑  收藏  举报