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)。



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一段将32位数据转换为4个8位字节的 C 代码: ``` #include <stdint.h> void convert_32_to_4_8(uint32_t data, uint8_t *bytes) { bytes[0] = data >> 24; bytes[1] = (data >> 16) & 0xff; bytes[2] = (data >> 8) & 0xff; bytes[3] = data & 0xff; } ``` 该函数接受一个 32 位无符号整数 `data` 和一个指向无符号 8 位整数的指针 `bytes`。它会将 `data` 转换为 4 个 8 位字节,并将这些字节存储到 `bytes` 所指向的数组。 具体来说,首先使用位运算符 `>>` 将数据的最高 8 位移到最低位,然后将结果存储在 `bytes[0]` 。接下来使用位运算符 `&` 和常量 `0xff` 将数据的次高 8 位移到最低位,然后将结果存储在 `bytes[1]` 。同理,将数据的次低 8 位移到最低位,然后将结果存储在 `bytes[2]` ,最后将数据的最低 8 位存储在 `bytes[3]` 。 ### 回答2: 将32位数据转换为4个8位字节可以通过位运算和移位操作来实现。 以下是用C语言写的一段代码实现该功能: ```c #include <stdio.h> void convert32to8(unsigned int num) { unsigned char byte1, byte2, byte3, byte4; byte1 = num & 0xFF; // 获取低8位字节 byte2 = (num >> 8) & 0xFF; // 获取第二个8位字节 byte3 = (num >> 16) & 0xFF; // 获取第三个8位字节 byte4 = (num >> 24) & 0xFF; // 获取最高8位字节 printf("转换后的四个字节为:%02X %02X %02X %02X\n", byte4, byte3, byte2, byte1); } int main() { unsigned int num = 0x12345678; // 待转换的32位数据 convert32to8(num); return 0; } ``` 运行结果为:转换后的四个字节为:12 34 56 78 代码,首先定义了四个8位无符号整数变量byte1、byte2、byte3和byte4。然后,通过位运算和移位操作,分别将32位数据num的低8位字节、第二个8位字节、第三个8位字节和最高8位字节提取出来,并存放到相应的变量。最后,使用`printf`函数将转换后的四个字节以16进制形式输出。 注意,32位数据的字节顺序与机器的字节顺序有关。以上代码是在小端字节序(Little-endian)机器上验证的。如果是大端字节序(Big-endian)机器,输出的字节顺序将相反。 ### 回答3: 要将一个32位的数据转换为4个8位的字节,可以使用C语言的位操作。 以下是一段代码示例: ```c #include <stdio.h> void convertToBytes(unsigned int num, unsigned char* bytes) { bytes[0] = (num >> 24) & 0xFF; bytes[1] = (num >> 16) & 0xFF; bytes[2] = (num >> 8) & 0xFF; bytes[3] = num & 0xFF; } int main() { unsigned int num = 123456789; // 要转换的32位数据 unsigned char bytes[4]; // 存储转换后的4个8位字节 convertToBytes(num, bytes); printf("转换结果:"); for (int i = 0; i < 4; i++) { printf("%u ", bytes[i]); } return 0; } ``` 在这段代码,我们定义了一个 `convertToBytes` 函数,它将一个32位的无符号整数 `num` 转换为4个8位的字节,并存储在 `bytes` 数组。通过右移和位与操作,将 `num` 的每个字节依次存储在 `bytes` 数组的每个元素。 在 `main` 函数,我们使用一个示例数据 `123456789`,调用 `convertToBytes` 函数,并打印转换后的结果。 输出结果为:``84 85 4 210``,即十进制转换为十六进制的结果为:``54 34 04 D2``。 这段代码可适用于任意32位的无符号整数的字节转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值