在C中打印定义的整数

在C中打印定义的整数,c,printf,parameter-passing,c-preprocessor,C,Printf,Parameter Passing,C Preprocessor,我在C中定义了一个整数作为 #define FOO_VERSION 04042012 当我将其传递给这样一个函数时: unsigned int version = FOO_VERSION; bar(version); 实际传递的值为1065994。 我使用GBD、打印变量版本和打印定义来验证这一点: “FOO_版本” 我的问题是造成这种情况的原因是什么,我看不出任何原因,除非有某种类型的类型转换正在进行,而我不知道这种转换是什么?以前导0开头的文字整数是C中的八进制数 因此0404012(基

我在C中定义了一个整数作为

#define FOO_VERSION 04042012
当我将其传递给这样一个函数时:

unsigned int version = FOO_VERSION;
bar(version);
实际传递的值为1065994。 我使用GBD、打印变量版本和打印定义来验证这一点: “FOO_版本”


我的问题是造成这种情况的原因是什么,我看不出任何原因,除非有某种类型的类型转换正在进行,而我不知道这种转换是什么?

以前导
0开头的文字整数是C中的八进制数


因此
0404012
(基数8)在(基数10)中是
1065994

0404012
是一个八进制(基数8)整数常量,因为初始值为0。删除它以定义十进制(以10为基数)整数:


0
开头的文字在基数8中

#define FOO_VERSION_8 04042012 // base 8
#define FOO_VERSION 4042012 // base 10
您可以使用
printf()


以前导0开头的整数是C中的八进制表示法

0404012是基数8。没有任何前导符号,它是基数10

你可能也会发现有趣的是 前导0x是十六进制(以16为基数)


所以0x10将是16位小数。

请注意,即使常量不会转换为八进制,作为整数的结果仍然会丢失前导零。大概OP希望将其作为日期,因此最好将其定义为字符串。同意。但我不确定OP是否希望以10为基数(在这种情况下,去掉前导的0)或以八进制打印(在printf中使用
%o
)或字符串,如您在日期的情况下所述(从外观上看很可能是这样)。将前导的u放在数字前面(U0404012)是否也能解决这一问题。是的,日期是要使用的。@如果要将其用作日期,使用字符串是更好的选择:
\define FOO\u VERSION“0404012”
const char*FOO\u VERSION=“0404012”
%s
。例如,如果
sizeof(int)
是2(假设字节=8bit),那么像
30122014
这样的日期不能用整数表示。前导0使整数被视为八进制值。即,删除前导0
#define FOO_VERSION_8 04042012 // base 8
#define FOO_VERSION 4042012 // base 10
printf("Version %08d\n", FOO_VERSION); // prints 04042012
//               ^