计算带有前导零的数字总和时C中的奇怪行为

bhe*_*bhe 2 c int unsigned leading-zero

我只是想用C编写一个简约程序来计算某个自然数的位数之和(数字之和定义如下:sumOfDigits(123)= 6,sumOfDigits(0)= 0,sumOfDigits(32013)= 9 , 等等).

到目前为止,使用以下代码片段一切正常.例如,对于5100,它正确地提供6.但是,为什么14为05100交付(记得领先的0)?

这里发生了什么?

我查看了数字的二进制表示,但这并没有给我任何信息.(顺便说一句:我想,以下代码应该在任何地方运行.)

#include <stdio.h>

unsigned int sumOfDigits(unsigned int n) {
    int retval = 0;
    while (n > 0) {
        retval += n % 10;
        n/=10;
    }
    return retval;
}

int main() {
    printf("OK: %u\n", sumOfDigits(5100u));
    printf("WTF: %u",  sumOfDigits(05100u));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如Zaibis所说......领先的0表示八进制表示法.:-)所以:5100_8 == 2624_10

dhe*_*ein 5

前导0表示您要使用八进制数字系统.

所以017也就是十进制:15

而你的05100将是十进制的:2624

  • @ user2717860,Zaibis,http://programmers.stackexchange.com/questions/98692/where-are-octals-useful (4认同)