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

C语言位计数代码异常:输出随机大数值求助

问题排查:C语言存储二进制位出现随机值的原因与解决

核心问题:数组越界访问导致未初始化内存读取

你的代码存在数组下标越界的严重问题,直接引发了随机值输出:

  • 数组fv的合法下标范围是0~31(定义为int fv[32]),但循环中i=0时,32 - i = 32,这已经超出了数组边界,属于非法内存访问。
  • 该错误导致数组前31个元素(fv[0]到fv[30])从未被赋值,栈上的未初始化内存会保留随机垃圾数据,输出时就会出现非0/1的大数值。

另外还有格式匹配问题:sizeof(5)返回size_t类型,用%ld打印属于格式不匹配,应该用%zu。

修正后的代码

#include <stdio.h>

int main() {
      printf("testing code\n");
      int fv[32] = {0}; // 初始化数组为0,避免意外
      int fiv = 5;
      for (int i = 0; i < 32; i++) {
            // 调整下标为31 - i,对应从最高位到最低位存入数组
            if (fiv & 1) fv[31 - i] = 1; 
            else fv[31 - i] = 0;
            fiv >>= 1;
      }
      printf("bit length of 5: %zu\n\n", (sizeof(5) * 8));
      printf("five: ");
      for (int i = 0; i < 32; i++) {
            printf("%d ", fv[i]);
      }
      printf("\n");
      return 0;
}

运行结果说明

修正后,数组会正确存储5的二进制位(5的二进制为00000000 00000000 00000000 00000101),输出示例:

testing code
bit length of 5: 32

five: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 

如果想把最低位存在数组第一个位置(fv[0]对应二进制第0位),直接将循环内的下标改为fv[i]即可。

内容的提问来源于stack exchange,提问作者synnøve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:22:44