C 位计数会导致意外行为

问题描述 投票:0回答:1

我正在用 C 语言编写一个汉明权重函数。我想知道我是否正确地完成了它,所以我的计划是测试数字 5。我不想在 google 上搜索 5 的二进制文件并编写了一些代码来做到这一点我自己,但是当我运行代码时我得到了这个:

testing code
bit length of 5: 32

five: -1354390872 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

这没有意义,因为没有任何东西能够输出这么大的负数。 这是我的代码

#include <stdio.h>

int main() {
      printf("\ntesting code\n");
      int fv[32];
      int fiv = 5;
      for (int i = 0; i < 32; i++) {
            if (fiv & 1) fv[32 - i] = 1; else fv[32 - i] = 0;
            fiv >>= 1;
      }
      printf("bit length of 5: %ld\n\n", (sizeof(5) * 8));
      printf("five: ");
      for (int i = 0; i < 32; i++) {
            printf("%d ", fv[i]);
      }
      printf("\n");
      return 0;
}

我期望用整数 0 或 1 填充数组,其中数组表示数字的二进制值。它确实用表示数字的 32 位整数填充了数组,但是 -1354390872 不是 0,也不是 1。我尝试将我迭代的数字更改为

(sizeof(n) * 8
以说明字节的大小,但这只是挂起,我无法弄清楚,因为没有
sizeof()
的联机帮助页。

有人可以帮忙吗,我确信有一种我不知道可以使用的二进制格式,但老实说我不知道。

c linux binary binary-data
1个回答
0
投票

您应该使用

fv[32 - i]
而不是
fv[31 - i]
来避免访问超出数组末尾。

© www.soinside.com 2019 - 2024. All rights reserved.