gpt4 book ai didi

c - C代码的输出,其中字符被分配了一个八进制数

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:46 25 4
gpt4 key购买 nike

#include<stdio.h>
int main(void)
{
char a = 01212;
printf("%d",a);
return 0;
}

在编译时我收到警告并输出 -118 怎么办?我知道 c 中以 0 开头的任何数字都被视为八进制。 01212 的八进制等效值是 650 那么为什么输出是 -118?

最佳答案

大多数系统上的分配 char a = 01212; 超出范围并且依赖于实现。具有 8 位 char 实现 2 的补码将打印 -118

有关详细信息,请阅读以下说明。

integer 不同,char 默认没有签名; C 中有三种不同的 char 类型。

字符,

符号字符

无符号字符

char 的范围从 CHAR_MINCHAR_MAX。对于特定的编译器,char 将使用底层有符号或无符号表示。您可以在系统的 limits.h 中检查此值。这是来自 C99 标准点号 15

的文本

6.2.5 Types

The three types char, signed char, and unsigned char are collectively called the character types. The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.35)

再次注意 35

35) CHAR_MIN, defined in , will have one of the values 0 or SCHAR_MIN, and this can be used to distinguish the two options. Irrespective of the choice made, char is a separate type from the other two and is not compatible with either.

话虽如此,char a = 01212; 大于 8 位。 C 标准允许 char 大小超过 8 位,但我认为当今世界几乎所有计算机都实现 8 位 char

因此,如果 char 实现为 unsigned char 且值大于 CHAR_MAX,则该值将根据 Modulo CHAR_MAX+1 进行转换.

在8位系统中,转换后的值为650模256即650-512 = 138

如果 char 作为 signed char 实现,则转换取决于实现。如果它是一个 8 位字符系统并且它实现了 2 的补码,那么该值将是 -118,正如您在结果中看到的那样。请注意,在此系统中,char 的范围将从 -128+127

关于c - C代码的输出,其中字符被分配了一个八进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46013045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com