我的十进制到十六进制转换函数只适用于正数



我在转换负数时遇到问题,从十进制到十六进制,使用以下函数:

#include <stdio.h>

int main()
{
int quotient, remainder;
int i, j = 0;
char hexadecimalnum[100];

quotient = -50;

while (quotient != 0)
{
remainder = quotient % 16;
if (remainder < 10)
hexadecimalnum[j++] = 48 + remainder;
else
hexadecimalnum[j++] = 55 + remainder;
quotient = quotient / 16;
}
strrev(hexadecimalnum);
printf("%s", hexadecimalnum);
return 0;
}

对于quotient = -50;,正确的输出应该是:

ffffffce

但是这个函数的输出是:

.

对于正数,输出总是正确的,但对于负数,则不正确。

我很难理解为什么它对负数不起作用。

修复:

  • unsigned int quotient-你需要将-50转换为一个大的十六进制数,以2的补码形式,否则你会在循环中得到错误的迭代次数(2),而不是按要求的8。
  • 删除"魔术数字":'0' + remainder'A' + remainder - 10
  • 0初始化hexadecimalnum,因为它需要在从那里打印字符串之前以null结束。更好的是,显式地添加null终止符。
  • 尽可能使用for循环。
  • 不妨从后到前存储字符,并节省反向字符串的额外调用

结果:

#include <stdio.h>
// 4 bytes*2 = 8 nibbles
#define HEX_STRLEN (sizeof(int)*2) 

int main()
{
unsigned int remainder;
int i = 0;
char hex[100];

for(unsigned int q = -50; q!=0; q/=16)
{
remainder = q % 16;
if (remainder < 10)
hex[HEX_STRLEN-i-1] = '0' + remainder;
else
hex[HEX_STRLEN-i-1] = 'A' + remainder - 10;
i++;
}
hex[HEX_STRLEN] = ''; // explict null termination
printf("%sn", hex);
}

(还有很多可以改进的地方,这只是初稿。)

您可以使用printf的格式说明符"%08x",然后您可以以各自的十六进制表示方式打印任何数字。

#include <stdio.h>
void num_to_hex(int a, char *ptr) { snprintf(ptr, 9, "%08x", a); }
int main() {
char hex[10] = {};
num_to_hex(-50, hex);
printf("%sn", hex);
return 0;
}

输出:

ffffffce

最新更新