面试的时候会遇到int类型和byte类型转换相关的问题。查阅相关资料后总结记录以备忘:
C中int型占4个字节32位,byte型占1个字节8位。
1、int型转byte型
这种情况比较简单。取int型的低八位赋值给byte型即可
2、byte型转int型
这种情况的转换结果有一个小细节需要注意,byte型转换的int型是有符号int,范围是-128~127(因为一共只有8位)。因此,若byte型数据最高位是1,转换后的int型数据为负数。除了在题目中注意这一点外,如需避免有效数据范围内的数据转换错误,根据余林丰的建议,可以在转换后的结果做一个正负数的判断:若是负数,则在该结果的基础上做一个256的正向调整。
3、左移<<
部分有无符号的int型。不论最高位是否为符号位,一律舍弃溢出位并在最低位补0。
如果移动位数n超过最高位数max(对于4字节int就是max=32),则取n%max进行移位(C编译器的处理方法,同右移)。
4、右移>>
右移就需要区分是否为有符号的int型了。
无符号int就是简单的在最高位补0;
对于有符号int型,右移>>需要在按正常移位(含符号位)后在最高位补个符号位,即保持符号不变。
5、思考
关于为什么这样左移、右移。
我是这样理解的。
计算机由于存储空间有限,表示的数值范围也是有限的。
对于byte型,表示有符号int的取值范围是-128(0x80)~127(0xff);那么在移位的过程中就涉及数值大小的缩放(以2/0.5为幂的幂指数变化关系)。一旦缩放结果超出了计算机的表示范围,就会发生溢出;这时候计算机还会按照正常的变化量去处理,只是会在数值取值范围内进行循环。
例如,(为方便起见)对于type型强制转换得到的有符号int,其取值范围是-128~127。
对于数-4(二进制表示为1111 1100),左移1位,未溢出,结果是-8(1111 1000);
对于数-127(二进制表示为1000 0001),左移1位后,若不发生溢出其绝对值会在-127的基础上扩大2倍,即结果浮动量为127。
实际呢?-127-127=-254超出了范围,那么计算机便在其取值范围内进行运算:先变化1达到最小值(-128),再沿相同的变化方向从最大值开始变化126个值,变化到127占了1个变化量,剩余的125个变化量就是127-125=2。所以-127左移1位之后就是2(舍弃最高位,最低位补0,得到0000 0010)。
以计算机能表示的最大最小值为边界,在数轴上去看会更好理解。
有符号int的右移为了跟未溢出的情况保持一致的规则,导致了有符号int的右移永远无法使其改变符号:负数无论如何右移都不会大于-1(1111 1111);正数无论如何右移都不会小于0(0000 0000)。