Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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如何处理带前导零的整数文本,atoi呢?_C_Literals - Fatal编程技术网

C如何处理带前导零的整数文本,atoi呢?

C如何处理带前导零的整数文本,atoi呢?,c,literals,C,Literals,当您创建一个前导为零的整数时,c如何处理它?不同版本的C有什么不同吗 在我的例子中,它们似乎被删除了(但这可能就是printf所做的吗?) #包括 int main(){ INTA=005; printf(“%i\n”,a); 返回0; } 我知道我可以使用printf来填充0,但我只是想知道它是如何工作的。整数没有“前导零”a 5是5,如果你愿意,你可以用前导0来写它的字符串表示,因为你有printf修饰符。前导零表示数字是以八进制或基数8表示的;因此,010=8。添加额外的前导零没有效果;

当您创建一个前导为零的整数时,c如何处理它?不同版本的C有什么不同吗

在我的例子中,它们似乎被删除了(但这可能就是printf所做的吗?)

#包括
int main(){
INTA=005;
printf(“%i\n”,a);
返回0;
}

我知道我可以使用printf来填充0,但我只是想知道它是如何工作的。

整数没有“前导零”a 5是5,如果你愿意,你可以用前导0来写它的字符串表示,因为你有printf修饰符。

前导零表示数字是以八进制或基数8表示的;因此,010=8。添加额外的前导零没有效果;正如你在数学中所期望的,x+0*8^n=x;通过延长其表示形式,不会对值进行更改

您经常看到的一个地方是UNIX文件模式;0755实际上意味着7*8^2+5*8+5=493;或者使用诸如0022=2*8+2=10之类的umask

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输出取决于其类型、值和格式说明符(以及活动区域设置)。

在所有版本的C中,前导零的数字表示八进制编码。因此
011==9==0x9

八进制是一种基于8的编号系统(十进制为10,十六进制为16)。因此
011==1*8+1,013==1*8+3
,等等。

在您的特定情况下,printf会删除零。 编译器会去掉所有前导零,但初始零除外,这会导致编译器将整数视为八进制。对于005,八进制和十进制表示法都是相同的,不应该让您感到烦恼,但是,除非您特别指八进制表示法,否则这会带来麻烦

前导零只与整数的字符串表示有关。要使用前导零打印,请使用“%03d”。这将确保字段长度为3

通常,“%d”将打印一个x字符宽的整数,并用前导空格填充。“%0d”将执行相同的操作,但将使用前导零进行填充。

您应该尝试:

int a = 5;
printf("%03i\n", a);
0表示“带零焊盘”,3表示所需的输出长度


编辑:对不起,我读你的问题太快了-现在我看到你问了一些完全不同的问题。不过,我将保持原样,因为这可能对其他人有所帮助。

前导零表示数字是八进制,这一事实常常被遗忘。我见过它多次引起混淆,例如,当有人试图使用一个漂亮的、规则的八位字节格式输入IP地址时:

192.168.010.073
解析器将最后2个八进制数解释为八进制数

唯一比C不幸使用前导零来表示数字八进制更糟糕的是Javascript处理前导零有时会表示数字八进制(如果其余数字正常,则数字为八进制,否则小于8进制)。在Javascript中,
(017==15)
但是
(018==18)

我宁愿有一个错误;实际上,我宁愿放弃八进制文字支持。至少在你的脸上加一个more-in-face前缀,比如maybe

0t10  (ocTal 8)
0k17  (oKtal 15)

但是我的提议已经晚了35年。

带前导的数字
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);
}
#包括
int main()
{
int binary=0b10;
int八进制=010;
整数小数=10;
int hexa=0x10;
printf(“%d%d%d%d\n”,八进制、十进制、十六进制、二进制);
}

欲了解更多信息,请访问。

我没有说它是一样的。显然,他的意图是添加0,而不是使用八进制。这对我来说并不明显,因为他表示他已经知道他可以在输出上填充0。显然,当您想用八进制表示法表示整数时,整数确实有前导0。@behrooz:它会输出十进制5,因为十进制和八进制5是相同的值。对于010和10,情况并非如此。打印出第一个,得到8(二进制1000或八进制010的十进制字符串表示)。把第二个打印出来,你会得到10(二进制1010或八进制012)。谢谢,也许这是一个不同的问题,但是如果atoi或strtol没有零的基数,前导零会发生什么?我现在完全理解了,谢谢!我确信这在我所有的基本C语言书中都有,只是我没有记住:-PI也在想同样的事情。。。看起来clang++和g++都将至少为
strtol(“0019”,NULL,10)
返回“19”。添加了“literal”,因为在二进制中
#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);
}