C语言循环左右移位错误排查求助:输入123右移3位结果异常
循环移位代码错误排查与修复
存在的问题
- 移位操作触发未定义行为:
bin_print函数中1 << i的1是int类型,当i ≥ 31时,32位int左移31位会触发未定义行为,必须使用无符号类型常量(如1U)保证移位合法。 - 未处理超范围移位位数:若输入的移位位数
n大于32(针对32位循环移位),32 - n会是负数,移位负数属于C标准中的未定义行为,需先对n取模32,确保其在0~31范围内。 - 输出格式不匹配:
rotateLeft和rotateRight中用%ld打印无符号类型变量,%ld是有符号长整型格式符,会导致符号转换错误,应使用对应无符号类型的格式符(如%u对应unsigned int)。 - 类型不统一:代码中使用
unsigned long int(通常64位),但bin_print仅打印低32位,若目标是实现32位循环移位,建议统一使用unsigned int类型,避免高位数据干扰。
修复后的代码
#include<stdio.h> #include <stdlib.h> void rotateLeft(unsigned int num, int n); void rotateRight(unsigned int num, int n); void bin_print(unsigned int num); int main() { printf("\tThis program is to circular right & left shift the int number by n\n\n"); printf("Possible operations\n1. circular right shift\n2. circular left shift\n"); int choice, n; unsigned int num; printf("Enter your choice: "); scanf("%d", &choice); printf("Enter a number: "); scanf("%u", &num); bin_print(num); printf("Enter number of rotation: "); scanf("%d", &n); (choice == 1) ? rotateRight(num, n) : rotateLeft(num, n); } void bin_print(unsigned int num) { for(int i = 31; i >= 0; i--) { if((num & (1U << i))) { printf("1"); } else { printf("0"); } if(i % 8 == 0) printf(" "); } printf("\n"); } void rotateLeft(unsigned int num, int n) { n = n % 32; unsigned int val = (num << n) | (num >> (32 - n)); bin_print(val); printf("%u", val); } void rotateRight(unsigned int num, int n) { n = n % 32; unsigned int val = (num >> n) | (num << (32 - n)); bin_print(val); printf("%u", val); }
验证输入123右移3位的情况
123的二进制为00000000 00000000 00000000 01111011,循环右移3位后,低3位011移至最高位,结果二进制为01100000 00000000 00000000 00011110,对应十进制为1610612750,修复后的代码将输出正确结果。
内容的提问来源于stack exchange,提问作者Balaji Baski
相关产品推荐
相关产品推荐

