题
在创建带前导零的整数,如何动C呢?是它为不同的版本的C不同?
在我的情况下,他们似乎只是被丢弃(但也许那是什么的printf呢?):
#include <stdio.h>
int main() {
int a = 005;
printf("%i\n", a);
return 0;
}
我知道我可以用printf与0垫,但我只是想知道这是如何工作的。
解决方案
前导零指示的数目中所表示的八进制或基座8;因此,010 = 8。添加额外的前导零没有影响;正如你所期望的数学,X + 0 * 8 ^ N = X;有通过使其表示更长的到的值没有变化。
一个地方,你经常会看到这样的UNIX文件方式; 0755实际上意味着7 * 8 ^ 2 + 5 * 8 + 5 = 493;或与使用umasks如0022 = 2 * 8 + 2 = 10。
atoi(nptr)
被定义为等同于strtol(nptr, (char **) NULL, 10)
,不同之处在于它不检测错误 - 正因为如此,atoi()
总是使用小数(并因此忽略前导零)。 strtol(nptr, anything, 0)
执行以下操作:
的字符串可以被任意的开始 的空白空间的量(如确定 通过
isspace(3)
随后)由单一 可选'+'
或'-'
迹象。如果基地 零或如图16所示,串然后可以 包括"0x"
前缀,而且数量 将在底座16被读取;否则, 零基被取为10(十进制) 除非下一个字符'0'
,在 这种情况下,取为8(八进制)。
因此,使用相同的规则与C编译器。
其他提示
注意!
在此语句005
是一个八进制常数。
int a = 005;
在这种情况下,也没有关系,因为单个位的八进制常数具有相同的值作为等效的十进制恒定的,但在C:015 != 15
无论文字的整数在八进制,十进制和十六进制表示,一旦它是由编译器解析它只是当作一个值。如何的整数是经由printf
输出仅取决于其类型,其值与所述格式说明(和活性区域)。
这是一个前导零表示数字是八进制的事实是什么,往往被遗忘。我已经看到了造成混乱几次,如使用一个不错的,常规格式的八位组,当有人试图输入的IP地址:
192.168.010.073
和解析器解释的最后2个字节为八进制数字。
比C的不幸使用前导零,使一些八进制更糟糕的唯一事情是JavaScript的处理的前导零的有时的做了一些八进制(数量为八进制,如果的数字,其余都是OK - 不到8 - 十进制其他)。在Javascript中,(017 == 15)
但(018 == 18)
。
我宁愿有是一个错误;其实我宁愿完全放弃的八进制的支持。至少使用更在你的脸上的前缀,如可能
0t10 (ocTal 8)
0k17 (oKtal 15)
但我大约35年太久下旬我的建议。
具有前导零的许多装置中C.所以011 == 9 == 0x9
的所有版本的八进制编码。
八路是基于(十进制而不是10或16进制)8的编号系统。所以011 == 1*8 + 1, 013 == 1*8 + 3
等
您应该尝试:
int a = 5;
printf("%03i\n", a);
0表示 “垫用零”,3是输出的期望的长度。
编辑:对不起,我读过你的问题得太快 - 现在我明白你问的东西完全不同。不过我会就是离开这一点,因为它可能是别人有帮助的。
与领先0
一个数字表示,该数量是一个八进制号。这就是所谓的整数常量。您还可以使用0b
用于表示的二进制数的,为的的十六进制数的是0x
或0X
。你并不需要编写的小数任何事情的。看到代码波纹管。
#include<stdio.h>
int main()
{
int binary = 0b10;
int octal=010;
int decimal = 10;
int hexa = 0x10;
printf("%d %d %d %d\n", octal, decimal, hexa, binary);
}
有关的更多信息,请浏览 tutorialspoint 。
整数不必“前导零” 5是5,你可能会写它的字符串表示与领先的0,如果您愿意,您有printf的改性剂。
<击>在特殊情况下,零正在printf的丢弃。击> 所有前导零被除外,其导致你的编译器把整数作为八进制初始零编译器剥离出来。对于005,无论是八进制和十进制表示是相同的,不应该打扰你,但尽管如此,它的自找麻烦,除非你专门意味着八进制表示。
前导零必须与整数的字符串表示纯粹做。与领先的零打印,使用“%03D”。这将确保的3字段长度。
在一般情况下,“%