C语言uint64_t转二进制函数输出错误,求排查修正方案
二进制转换函数异常排查与修复
给定约束:主函数与头文件不可修改,需在convert.c中实现void convert_to_binary(uint64_t number, enum ZERO_OR_ONE bits[])和void convert_to_hexadecimal(uint64_t number, uint8_t hex[])函数。其中十六进制转换函数工作正常,但二进制转换函数输出异常:输入数值5564275972427363982时,当前输出为1011 0010 1100 0111 1011 1000,预期输出为0100 1101 0011 1000 0100 0111。
相关代码
主函数代码
#include <inttypes.h> #include <stdlib.h> void print_binary( FILE* out, enum ZERO_OR_ONE bits[]); void print_hex( FILE* out, uint8_t hex[]); void print_hex_compact( FILE* out, uint8_t hex[]); int main( int argc, char* argv[] ) { if ( argc != 3 ) { fprintf( stderr, "USAGE: %s <input file> <output file>\n", argv[0] ); exit(1); } FILE* in = fopen(argv[1], "r"); FILE* out = fopen(argv[2], "w"); fprintf( out, "%20s%20s\n", "Input","Converted"); uint64_t number; fscanf( in, "%" SCNu64, &number ); enum ZERO_OR_ONE bits[64]; uint8_t hex[16]; while( !feof( in ) ) { fprintf( out, "%20" PRIu64 "\t", number ); convert_to_binary( number, bits ); print_binary(out, bits); convert_to_hexadecimal(number, hex ); fprintf( out, "%20" PRIu64 "\t", number ); print_hex_compact(out, hex); fscanf( in, "%" SCNu64, &number ); } fclose(in); fclose(out); return 0; } void print_binary( FILE* out, enum ZERO_OR_ONE bits[]) { for ( int i=63; i>=0; i-- ) { if ( bits[i] == ZERO ) fprintf(out, "0"); else fprintf(out, "1"); if ( i % 4 == 0 ) fprintf(out, " "); } fprintf(out, "\n"); }
当前二进制转换函数代码
void convert_to_binary(uint64_t number, enum ZERO_OR_ONE bits[]) { for (int i = 63; i >= 0; i--) { bits[i] = (enum ZERO_OR_ONE)((number >> i) & 1); } }
十六进制转换函数代码
void convert_to_hexadecimal(uint64_t number, uint8_t hex[]) { for (int i = 15; i >= 0; i--) { uint8_t digit = (number >> (i * 4)) & 0xF; // Store the hexadecimal digit in the array. hex[i] = digit; } }
错误原因分析
对比当前输出与预期输出,二者是按位取反的关系(当前输出的1对应预期的0,0对应预期的1)。结合十六进制函数工作正常的前提,核心问题出在二进制转换函数对enum ZERO_OR_ONE的赋值逻辑:
头文件中enum ZERO_OR_ONE的定义大概率是ZERO=1,ONE=0(与常规定义相反),而当前函数直接将位运算结果(number >> i) & 1赋值给bits[i],导致存储的ZERO和ONE与实际位值颠倒。
修复方法
针对枚举定义颠倒的情况,修改二进制转换函数,将位运算结果取反后再赋值:
void convert_to_binary(uint64_t number, enum ZERO_OR_ONE bits[]) { for (int i = 63; i >= 0; i--) { // 取反位运算结果,匹配ZERO=1、ONE=0的枚举定义 bits[i] = (enum ZERO_OR_ONE)(1 - ((number >> i) & 1)); } }
验证
以输入5564275972427363982为例,修复后的函数会将原二进制位取反后存储,匹配print_binary函数的输出逻辑,得到预期的0100 1101 0011 1000 0100 0111。
内容的提问来源于stack exchange,提问作者s1mple
相关产品推荐
相关产品推荐

