Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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_Printf_Octal - Fatal编程技术网

在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