int和char之间的实际区别

9

我需要分析这些代码片段的输出结果:

int x, y;
x = 200; y = 100;
x = x+y; y = x-y; x = x-y;
printf ("%d %d\n", x, y);

char x, y;
x = 200; y = 100;
x = x+y; y = x-y; x = x-y;
printf ("%d %d\n", x, y);

我现在知道int代表整数,char代表字符;我已经了解它们之间的区别,如果我在printf中使用%d,它会以数字形式返回,而%c则以字符形式返回。

例如,'A'的ASCII字符代码是65,但为什么第二个函数打印出100 -56,而不是100 200


1
你的 char 默认情况下不是无符号的。因此,它会发生溢出。 - Richard J. Ross III
5
一个 C 语言的 char 类型占8位,因此最大的正数是127。 - Hot Licks
1
更具体地说,它可以是有符号的或无符号的,而char本身的类型因实现而异。如果您希望在每个实现中都使用特定类型,则必须使用特定类型。其他类型(例如int)默认为有符号。 - chris
2
@BrettDuncavage并不是很好,因为它会对许多值产生未定义的行为。有替代方案不会产生这种情况,例如使用异或。 - Jim Balter
1
@chris - 是的,char在历史上一直有一个不稳定的定义,C语言仍然必须(在某种程度上)适应现在已经基本消失的具有不同大小“字节”的硬件。因此,你所说的关于char的任何内容都带有大量的警告。 - Hot Licks
显示剩余4条评论
2个回答

11

在问题中使用的平台上,类型char似乎是1个字节(8位)大小,并且是带有1个符号位和7个值位的有符号类型(并使用2的补码算术)。 它存储从-128到127的值。 因此,这就是xy正在发生的事情:

x = 200 => x takes value -56
y = 100 => y takes value 100
x = x+y => x takes value 44
y = x-y => y takes value -56
x = x-y => x takes value 100

为什么不是-127到128呢? 顺便说一下,谢谢你的解释,现在很清楚了。 - Souza
@Souza,使用最左边的位作为符号位,在纸上不断加1。虽然C语言不能保证这一点(只保证signed char的范围在[-127,127]之间),但这是今天非常普遍的做法。要查找的术语是二进制补码。 - chris
5
"Apparently, in the C environment you are using, chars aren't necessarily 8 bits, nor are they necessarily signed." (“显然,在您使用的C环境中,字符不一定是8位,也不一定是有符号的。”) - Jim Balter

9

C语言有多种整数类型:char(至少8位)、short(至少16位)、int(至少16位)、long(至少32位)。这些类型还有对应的无符号版本。如果你给一个普通类型赋值超过了它的范围,结果是未定义的(你不应该这样做,编译器可能会认为你从不这样做,而根本不检查)。在无符号情况下,它们会“绕回”。但请注意,这些大小不能保证,只能保证它们的最小大小。曾经有一些机器上所有类型都是32位宽。


@chris 这与本答案无关。char 可以是32位宽,但 sizeof(char) 仍然是1。 - Jim Balter
@JimBalter,是的,我正在考虑这个问题。尽管我知道这不是真的,但我的思维飞快地转向了一个字节等于八位的方向。 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接