我在转换负数时遇到问题,从十进制到十六进制,使用以下函数:
#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