You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:16:39