for循环初始化失败

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

我正在尝试为

for
循环设置索引以遍历字符数组。 由于某种原因,当我进入调试模式时,我看到变量
i
(我将其用作
for
循环中的索引)初始化为 0 步骤是
i++
而不是
i--

在 ubuntu 上使用

ddd
调试器。

我尝试将

i
设置为常量,但失败了。

c for-loop indexing initialization
1个回答
0
投票

正如置顶评论中提到的,有很多问题......

  1. 你有UB(未定义行为)。你将超越终点。尝试将
    for (i = num_bits; i >= 1; i--)
    更改为
    for (i = num_bits - 1; i >= 1; i--)
  2. 您使用大尾数作为输入数字,但使用小尾数作为总和。
  3. a
    b
    向量使用ascii值(例如
    '0'-'1'
    )而不是binary(例如
    0x00-0x01
    )。并且,
    sum
    向量使用binary。这些应该匹配。
  4. pow(2*Bin_Rep_sum[i],i)
    错了。你想要吗:
    Bin_Rep_sum[i] * pow(2,i)
    ???事实上,这是仍然错误

因为代码是作为图像发布的,并且缺少一些关键元素,所以我必须完全重构代码。它纠正了所有上述问题:

#include <stdio.h>
#include <string.h>

typedef unsigned int u32;

#define BITS_PER_BYTE       8
#define BITV_SIZE_INP       (sizeof(u32) * BITS_PER_BYTE)
#define BITV_SIZE_CARRY     (BITV_SIZE_INP + 1)
typedef unsigned char bitv[BITV_SIZE_CARRY];

// uint_to_binary -- convert integer to bit vector
// RETURNS: leftmost one bit(?)
int
uint_to_binary(u32 x,bitv bin)
{

    memset(bin,0,BITV_SIZE_CARRY);

    int bit = 0;

    // store digits from right-to-left (LSB to MSB)
    for (;  x != 0;  x >>= 1, ++bit)
        bin[bit] = x & 1;

    return bit;
}

// my_add -- convert integers to bit vectors and compute bit vector sum
u32
my_add(u32 a,u32 b,bitv bin_sum)
{

    // convert a to bit vector
    bitv bin_a;
    uint_to_binary(a,bin_a);

    // convert b to bit vector
    bitv bin_b;
    uint_to_binary(b,bin_b);

    // zero out the sum
    uint_to_binary(0,bin_sum);

    u32 carry = 0;
    int bit = 0;

    for (;  bit < BITV_SIZE_INP;  ++bit) {
        // get the current digits
        u32 a = bin_a[bit];
        u32 b = bin_b[bit];

        // get the sum of the two numbers plus the carry in
        u32 sum = (a + b) + carry;

        // store the current digit
        bin_sum[bit] = sum & 1;

        // get carry out (for next round)
        carry = sum >> 1;
    }

    // store the final carry out
    bin_sum[bit] = carry;

    return carry;
}

// putbit -- output a single bit
void
putbit(u32 bit)
{
    bit = bit ? '1' : '0';
    fputc(bit,stdout);
}

// my_print -- print a bit vector
void
my_print(bitv bin)
{
    int bit = BITV_SIZE_CARRY - 1;

    putbit(bin[bit]);
    fputc('+',stdout);

    for (bit -= 1;  bit >= 0;  --bit)
        putbit(bin[bit]);
}

// dotest -- show an integer number
void
intshow(u32 x,const char *sym)
{

    putbit(0);
    fputc('+',stdout);

    for (int bit = BITV_SIZE_INP - 1;  bit >= 0;  --bit)
        putbit((x >> bit) & 1);

    printf(" %8.8X %s\n",x,sym);
}

// dotest -- test a single addition
void
dotest(u32 a,u32 b)
{
    u32 sum = a + b;

    // show the original input numbers
    intshow(a,"a");
    intshow(b,"b");
    intshow(sum,"sum");

    // get the sum
    bitv bin_sum;
    my_add(a,b,bin_sum);

    // show the bit vector sum
    my_print(bin_sum);
    printf(" bin_sum\n");

    printf("\n");
}

int
main(void)
{

    dotest(1,2);
    dotest(2,2);
    dotest(3,7);
    dotest(0xFFFFFFFE,1);
    dotest(0xFFFFFFFF,1);
    dotest(0xFFFFFFFF,0xFFFFFFFF);

    return 0;
}

这是测试程序的输出:

0+00000000000000000000000000000001 00000001 a
0+00000000000000000000000000000010 00000002 b
0+00000000000000000000000000000011 00000003 sum
0+00000000000000000000000000000011 bin_sum

0+00000000000000000000000000000010 00000002 a
0+00000000000000000000000000000010 00000002 b
0+00000000000000000000000000000100 00000004 sum
0+00000000000000000000000000000100 bin_sum

0+00000000000000000000000000000011 00000003 a
0+00000000000000000000000000000111 00000007 b
0+00000000000000000000000000001010 0000000A sum
0+00000000000000000000000000001010 bin_sum

0+11111111111111111111111111111110 FFFFFFFE a
0+00000000000000000000000000000001 00000001 b
0+11111111111111111111111111111111 FFFFFFFF sum
0+11111111111111111111111111111111 bin_sum

0+11111111111111111111111111111111 FFFFFFFF a
0+00000000000000000000000000000001 00000001 b
0+00000000000000000000000000000000 00000000 sum
1+00000000000000000000000000000000 bin_sum

0+11111111111111111111111111111111 FFFFFFFF a
0+11111111111111111111111111111111 FFFFFFFF b
0+11111111111111111111111111111110 FFFFFFFE sum
1+11111111111111111111111111111110 bin_sum
© www.soinside.com 2019 - 2024. All rights reserved.