我如何使用整数变量执行八进制算术?

时间:2015-11-13 03:37:36

标签: c integer octal

假设我想在C中添加两个八进制值01440144

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作为八进制用于算术?

1 个答案:

答案 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$