C语言中byte类型与int类型转换与移位小细节记录

面试的时候会遇到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)。




版权声明:本文为weixin_40782680原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。