假设我想在C中添加两个八进制值0144
到0144
。
int a = 0144;
int b = 0144;
int result = a + b;
printf("%d, %o", result, result);
> 200, 310
在我的程序中,输入十六进制值,将其转换为八进制值,但转换结果看起来像基数10中的整数而不是基数8.
例如:
int oct = convertHexToOct(64)
printf("%d, %o", oct, oct);
> 144, 220
int result = oct + oct;
printf("%d, %o, result, result);
> 288, 440
因此,oct变量的十进制表示实际上是所需整数的八进制值。这意味着使用此变量进行的任何算术都将在基数10中完成,这不是我想要做的。
理想情况下,我基本上想做的事情就像是
int intAsOct = "0" + oct;
int octalResult = intAsOct + intAsOct;
但这显然不起作用。所以问题的根源是,如何处理保存的整数变量而不将前导0作为八进制用于算术?
答案 0 :(得分:2)
根据你的评论:
如何获取base10整数,“144”并让C将其视为base8 整数,“0144”
你可以手动完成,但最简单的方法是通过标准库字符串函数转换它,如下所示:
#include <stdio.h>
#include <stdlib.h>
int dec_to_oct(const int dec)
{
char buffer[64];
char * endptr;
/* Convert number to decimal string representation */
sprintf(buffer, "%d", dec);
/* Convert decimal string representation back as octal */
long l = strtol(buffer, &endptr, 8);
if ( *endptr != '\0' ) {
fprintf(stderr, "Error! Could not convert decimal %d to octal.\n", dec);
exit(EXIT_FAILURE);
}
return (int) l;
}
int main(void)
{
int num = 144;
printf("Before conversion: %d, %#o, %#x\n", num, num, num);
num = dec_to_oct(num);
printf("After conversion: %d, %#o, %#x\n", num, num, num);
dec_to_oct(999); /* This will fail */
return 0;
}
带输出:
Paul@Pauls-iMac:~/Documents/src/sandbox$ ./dec_to_oct
Before conversion: 144, 0220, 0x90
After conversion: 100, 0144, 0x64
Error! Could not convert decimal 999 to octal.
Paul@Pauls-iMac:~/Documents/src/sandbox$