打印包含二进制数作为元素的数组时输出不匹配
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 为基数)数字。在八进制中,8
是 10
,这就是为什么 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
因为在默认参数提升之后,输出值可以用这种类型表示.
为什么下面编写的代码给出这样的输出,而不是仅仅返回所写的元素:
代码
#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 为基数)数字。在八进制中,8
是 10
,这就是为什么 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
因为在默认参数提升之后,输出值可以用这种类型表示.