考虑下面的C代码:
#include <stdio.h>
int main()
{
int i = 012;
printf("%d", i);
}
在O / P上,i
的值打印为10.我知道(012) 8 =(10) 10 。但我对C如何存储int
变量值感到困惑。任何人都可以向我解释一下吗?
答案 0 :(得分:7)
它们以二进制形式存储,您可以使用许多表示来定义它们,但最后它是使用的二进制表示。
答案 1 :(得分:1)
硬件内存以bytes运行。因此,程序中最后的任何变量(int,char,指针或数组)都将转换为字节。如何&#34; C&#34;将再次这样做取决于硬件。请参阅Endianness和Size of int long type。
假设您有32位小端计算机。任何&#39;&#39;在32位世界中,将存储为内存中的四个连续字节。这意味着在你的情况下,无论你使用什么字面意思,它是&#39; 012&#39;或者&#39; 10&#39;,它将像这样存储:
binary: 00001010 00000000 00000000 00000000
octal: 12 0 0 0
decimal: 10 0 0 0
hex: A 0 0 0
连续四个字节的内存。
答案 2 :(得分:0)
所有值都使用二进制表示存储(对于整数,浮点数,字符等都是如此)。值int
(十进制)存储为二进制数字序列i = 012;
(假设为32位012
类型)。
在像
这样的作业声明中0
编译器知道如何将文字12
中的八进制数字字符串转换为上面的二进制表示。前导00000000000000000000000000001100
告诉编译器该值是八进制表示,否则它将尝试存储十进制值printf
(printf("%d\n", i);
)。
在%d
声明中
printf
转换说明符i
告诉10
显示存储在%x
中的值,格式为十进制数字字符串(a
)。同样,转换说明符<IfModule mod_rewrite.c>
Options -Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_COOKIE} !cfnw-hash [NC]
RewriteRule ^resources/newspaper /error/401 [R=401,NC,L]
# Force to exclude the trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.*)/$
RewriteRule ^(.+)/$ $1 [R=307,L]
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [QSA,L]
</IfModule>
将显示格式为十六进制数字字符串({{1}})的值。
答案 3 :(得分:-3)
据我所知,它是C整数处理程序,它看到前导0,然后将其解释为基数8或八进制常量。
很抱歉只是为了重定向你,但我担心在这篇文章中我不能说比Abimaran Kugathasan更好:
Why int j = 012 giving output 10?
有关更深入的解释,请参阅bdonlan的答案: How does C Handle Integer Literals with Leading Zeros, and What About atoi?