在C中存储以零开头的值变异,为什么?
例如:
int main(){ int x = 01234567; printf("\n%d\n",x); return 0; }
以下代码生成:342391
如果我在开头没有包含0,那么值x将是1234567,为什么C以这种方式存储值并且有没有办法让它不这样做?
因为以0开头的数字表示为八进制数 。 您无法真正修改此行为,只是不要在开头包含零。
以0开头的数字常量被解释为基数8。
用前导0写的整数常量被解释为八进制(base-8),而不是十进制(base-10)。 这类似于0x
触发hex(base-16)解释。
基本上你所能做的就是不要在整数常量上设置前导0。
在编译时,C编译器将识别代码中的任何整数文字,然后通过一组规则解释这些文字以获取其二进制值供程序使用:
- Base-16(hex) – 任何以“0x”开头的整数文字都将被视为hex值。 所以
int x = 0x22
给出x
的小数值2 * 16^1 + 2 * 16^0 = 34
。 - Base-8(Octal) – 任何以’0’开头的整数文字都将被视为八进制值。 所以
int x = 022
给出x
的小数值2 * 8^1 + 2 * 8^0 = 18
。 - Base-10(十进制) – 任何与其他两个规则不匹配的整数文字都将被视为十进制值。 所以
int x = 22
给出x
的十进制值22
。
应该注意的是,GCC 支持扩展 , 该扩展提供了用于以二进制格式指定整数的另一规则。 此外,这些规范方法仅在编译时支持整数文字。