I'm not seeing where I went wrong on this so I'm hoping someone here can see it instead.

Output of the results (r/t) with the values starting off with:

Function that gives t it's resultCode:r = 0b01100001010111111101101110110101, num = 0b10111100111001000010100001001001 t = 0b01100001010111111101101110110100, val = 0b01010001100110110101000000001101

Bonus question, can anyone tell me why this function would have a different output than the above despite using the exact same logic for it's loop?Code:int bnum_op_mul( bnum_t num, bnum_t const val ) { int ret; size_t width; bool carry; bit_t n, v, e, c; bnum_t cpy; PRINT_IF_TRUE( (ret = bnum_mem_chk( val )) != 0, return ret; ) PRINT_IF_TRUE( (ret = bnum_mem_dup( &cpy, num )) != 0, return ret; ) num.sig_bit = 0; (void)bnum_op_min( num ); num.sig_bit = cpy.sig_bit; e = bit_op_dec(num.width); e.bit = num.sig_bit ? (num.value[e.node] & e.bit) : 0; for ( v = val.start; v.b < val.width.b; v = bit_op_inc(v) ) { if ( val.value[v.node] & v.bit ) { carry = 0; #if 0 PRINT_IF_TRUE( (ret = bnum_op_add( num, cpy )) != 0, return ret; ) #else for ( n = num.start, c = cpy.start; c.b < cpy.width.b; n = bit_op_inc(n), c = bit_op_inc(c) ) { if ( carry ) { if ( num.value[n.node] & n.bit ) num.value[n.node] ^= n.bit; else { num.value[n.node] |= n.bit; carry = 0; } } if ( cpy.value[c.node] & c.bit ) { if ( num.value[n.node] & n.bit ) { num.value[n.node] ^= n.bit; carry = 1; } else num.value[n.node] |= n.bit; } } if ( carry ) { for ( ; n.b < num.width.b; n = bit_op_inc(n) ) { if ( num.value[n.node] & n.bit ) num.value[n.node] ^= n.bit; else { num.value[n.node] |= n.bit; carry = 0; break; } } } #endif } num.width = cpy.width = bit_op_dec( cpy.width ); num.start = bit_op_inc( num.start ); num.start.b = 0; } (void)bnum_mem_dec( &cpy, cpy.width.b ); return bnum_clamp_inc( num, e.bit ); }

Code:int bnum_op_add( bnum_t num, bnum_t const val ) { int ret; size_t width; ub carry; bit_t n, v, e; PRINT_IF_TRUE( (ret = bnum_mem_chk( num )) != 0, return ret; ) PRINT_IF_TRUE( (ret = bnum_mem_chk( val )) != 0, return ret; ) carry = 0; width = (num.width.b < val.width.b) ? num.width.b : val.width.b; e = bit_op_dec( num.width ); e.bit = num.sig_bit ? (num.value[e.node] & e.bit) : 0; for ( n = num.start, v = val.start; n.b < width; n = bit_op_inc(n), v = bit_op_inc(v) ) { if ( carry ) { if ( num.value[n.node] & n.bit ) num.value[n.node] ^= n.bit; else { num.value[n.node] |= n.bit; carry = 0; } } if ( val.value[v.node] & v.bit ) { if ( num.value[n.node] & n.bit ) { num.value[n.node] ^= n.bit; carry = 1; } else num.value[n.node] |= n.bit; } } if ( carry ) { for ( ; n.b < num.width.b; n = bit_op_inc(n) ) { if ( num.value[n.node] & n.bit ) num.value[n.node] ^= n.bit; else { num.value[n.node] |= n.bit; carry = 0; break; } } } ret = bnum_clamp_inc( num, e.bit ); return ret; }