打印包含二进制数作为元素的数组时输出不匹配

mismatched output in printing array conatining binary number as element

为什么下面编写的代码给出这样的输出,而不是仅仅返回所写的元素:

代码

#include<stdio.h>
int main()
{   int temp,a[8] = {000,001,010,011,100,101,110,111};
    for(temp = 0;temp < 8;temp++)
        printf("%d\n",a[temp]);

}

输出

0
1
8
9
100
101
110
111

任何以 0 开头的整数常量都会成为八进制(以 8 为基数)数字。在八进制中,810,这就是为什么 010,一个八进制常量,被打印为十进制整数 8。从技术上讲,0 itself is an octal constant too,虽然这没有真正的区别.对于带有 0 前缀的其余号码也是如此。

C 中没有二进制常量(与 C++ 相反)。而且也没有可用于以二进制表示形式输出整数的转换说明符(您可以以十六进制表示形式输出整数)。但是有一个八进制整数常量的概念。

来自 C 标准(6.4.4.1 整数常量)

Syntax

1     integer-constant:
          decimal-constant integer-suffixopt
          octal-constant integer-suffixopt
          hexadecimal-constant integer-suffixopt

  octal-constant:
      0
      octal-constant octal-digit

从语法中可以看出,任何以零开头的整数常量 (0) 都是八进制常量。

在这个数组声明中

int temp,a[8] = {000,001,010,011,100,101,110,111};

数组的前四个元素由八进制常量初始化,这些常量表示以下十进制值 0, 1, 8, 9。所有其他常量都是十进制整数常量。

如果您希望所有初始化器都是八进制整数常量,您必须编写

int temp,a[8] = {000,001,010,011,9100,9101,9110,9111};

在这种情况下,您可以按照初始化列表中所写的形式输出它们。

#include <stdio.h>

int main(void) 
{
    int a[] = { 000, 001, 010, 011, 0100, 0101, 0110, 0111 };
    const size_t N = sizeof( a ) / sizeof( *a );
    
    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%03o ", a[i] );
    }
    
    putchar( '\n' );
    
    return 0;
}

程序输出为

000 001 010 011 100 101 110 111 

printf 的调用中,不需要将表达式 a[i] 转换为类型 unsigned int 因为在默认参数提升之后,输出值可以用这种类型表示.