Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,存储以零开始的值会发生变异,为什么?_C_Int_Storage - Fatal编程技术网

在C语言中,存储以零开始的值会发生变异,为什么?

在C语言中,存储以零开始的值会发生变异,为什么?,c,int,storage,C,Int,Storage,例如: int main(){ int x = 01234567; printf("\n%d\n",x); return 0; } 以下代码生成:342391 如果我没有在开始时包含0,那么值x将是1234567,为什么C以这种方式存储该值,并且有没有办法从不这样做中获取该值?因为以0开头的数字表示为。您无法真正修改此行为,只是不要在开头包含零。以0开头的数值常量被解释为基数8。以前导0写入的整数常量被解释为八进制(基数8),而不是十进制(基数10)。这类似于触

例如:

int main(){

    int x = 01234567;

    printf("\n%d\n",x);

    return 0;

}
以下代码生成:342391


如果我没有在开始时包含0,那么值x将是1234567,为什么C以这种方式存储该值,并且有没有办法从不这样做中获取该值?

因为以0开头的数字表示为。您无法真正修改此行为,只是不要在开头包含零。

以0开头的数值常量被解释为基数8。

以前导0写入的整数常量被解释为八进制(基数8),而不是十进制(基数10)。这类似于触发十六进制(base-16)解释的
0x


基本上,这里所能做的就是不在整型常量上加前导0。

在编译时,C编译器将识别代码中的任何整型文字,然后通过一组规则对其进行解释,以获得二进制值供程序使用:

  • Base-16(十六进制)-任何以“0x”开头的整数文本都将被视为十六进制值。因此
    int x=0x22
    给出
    x
    的十进制值
    2*16^1+2*16^0=34
  • Base-8(八进制)-任何以“0”开头的整数文本都将被视为八进制值。因此
    int x=022
    给出
    x
    的十进制值
    2*8^1+2*8^0=18
  • Base-10(十进制)-任何与其他两个规则不匹配的整数文本都将被视为十进制值。因此
    int x=22
    给出
    x
    的十进制值
    22
应该注意的是,GCC提供了另一个以二进制格式指定整数的规则。此外,这些规范方法在编译时仅支持整数文本