在C语言中,为什么可以';是否打印负值?
所以当我运行这个:在C语言中,为什么可以';是否打印负值?,c,printf,octal,C,Printf,Octal,所以当我运行这个: printf("%o", -1); 它打印出37777 为什么我得到这个输出 我以为这是-1的第一个补码,但为什么一开始是3 根据ISO C标准(C117.21.6.1 fprintf函数/8),%o以八进制打印无符号值: o,u,x,x-将无符号int参数转换为无符号八进制(o)、无符号十进制(u)或无符号十六进制表示法(x或x) 根据您的输出,您有一个32位2的补码int类型,其中-1表示为二进制: 11111111 11111111 11111111 11111111
printf("%o", -1);
它打印出37777
为什么我得到这个输出
我以为这是-1
的第一个补码,但为什么一开始是3
根据ISO C标准(C117.21.6.1 fprintf函数/8
),%o
以八进制打印无符号值:
o,u,x,x-将无符号int
参数转换为无符号八进制(o
)、无符号十进制(u
)或无符号十六进制表示法(x
或x
)
根据您的输出,您有一个32位2的补码int
类型,其中-1
表示为二进制:
11111111 11111111 11111111 11111111
\/\_/\_/ \_/\_/\__/\_/\_/\__/\_/\_/
3 7 7 7 7 7 7 7 7 7 7
底线显示八进制表示(您看到的)
你之所以在前面看到一个3
,是因为每个八进制数字代表三位,32不能被三整除
但是,您应该记住,这里的任何行为都是可以接受的。根据上面的ISO引文,%o
需要一个无符号int
,并且根据后面的小节/9
:
如果任何参数不是相应转换规范的正确类型,则行为未定义
如果您的
int
是64位的,那么它会有细微的不同(当然,也会更长)。32位值的前面将有两个额外的位(32%3==2
),但64位值只有一个(64%3==1
)。所以你最终会得到:
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
|\_/\_/\__/\_/\_/ \_/\_/\__/\_/\_/\__/\_/\_/ \_/\_/\__/\_/\_/\__/\_/\_/
1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
根据ISO C标准(C117.21.6.1 fprintf函数/8
),%o
以八进制打印无符号值:
o,u,x,x-将无符号int
参数转换为无符号八进制(o
)、无符号十进制(u
)或无符号十六进制表示法(x
或x
)
根据您的输出,您有一个32位2的补码int
类型,其中-1
表示为二进制:
11111111 11111111 11111111 11111111
\/\_/\_/ \_/\_/\__/\_/\_/\__/\_/\_/
3 7 7 7 7 7 7 7 7 7 7
底线显示八进制表示(您看到的)
你之所以在前面看到一个3
,是因为每个八进制数字代表三位,32不能被三整除
但是,您应该记住,这里的任何行为都是可以接受的。根据上面的ISO引文,%o
需要一个无符号int
,并且根据后面的小节/9
:
如果任何参数不是相应转换规范的正确类型,则行为未定义
如果您的
int
是64位的,那么它会有细微的不同(当然,也会更长)。32位值的前面将有两个额外的位(32%3==2
),但64位值只有一个(64%3==1
)。所以你最终会得到:
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
|\_/\_/\__/\_/\_/ \_/\_/\__/\_/\_/\__/\_/\_/ \_/\_/\__/\_/\_/\__/\_/\_/
1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
虽然在十进制以外的任何基中显示有符号的数字通常没有多大意义,但十进制并没有什么特别之处,它表示它是唯一可以显示负数的基 例如,如果您有两个地址,您可能想知道它们之间的差异,这可能是负数。当然,你会希望看到结果是十六进制 事实上,Python完全可以在本地显示负十六进制值 因此,这里有一种使用非
%d
的说明符显示负数的方法,即%o
:
int x = -1;
printf("%s%o", x<0 ? "-" : "", x<0 ? 0u-x : 0u+x);
intx=-1;
printf(“%s%o”,x虽然在十进制以外的任何基中显示有符号的数字通常没有多大意义,但十进制并没有什么特别之处,它是唯一可以显示负数的基
例如,如果你有两个地址,你可能想知道它们之间的差异,可能是负数,当然你会希望看到结果是十六进制
事实上,Python完全可以在本地显示负十六进制值
因此,这里有一种使用非%d
的说明符显示负数的方法,即%o
:
int x = -1;
printf("%s%o", x<0 ? "-" : "", x<0 ? 0u-x : 0u+x);
intx=-1;
printf(“%s%o”),xAn八进制数字表示3位;整数中的位数通常不能被3整除,这里也没有。%o
只打印无符号整数。因为它是32位数字,而八进制中的37777是32位。另外,为了回答标题中的问题,%o
打印无符号整数,就像%x
在这里你可以得到ffffffff
一个八进制数字代表3位;一个整数中的位数通常不能被3整除,它不在这里。%o
只打印无符号整数。因为它是一个32位的数字,而八进制中的37777是32位。另外,为了回答标题中的问题,%o
打印unsigned integer,就像%x
你会得到ffffffff
,仅仅因为你认为在10以外的任何基数中显示负数都没有意义,并不意味着我的答案应该被否决。我没有否决,但这个答案将int
参数传递给printf(“…%o
,但最好避免它。我也没有投反对票,但在盲目地对整数求反之前我被发现了-它并不总是做你通常期望的事情,特别是使用INT\u MIN
:-)也许换成xThanks@chux,我喜欢这样,只是因为你认为在10以外的任何基数中显示负数都没有意义,这并不意味着我的答案应该被否决。我没有否决,但这个答案将int
参数传递给printf(“…%o
,但最好避免它。我也没有投反对票,但我在盲目地对整数求反之前就被发现了-它并不总是做你通常期望的事情,尤其是INT\u MIN
:-)也许改成xThanks@chu