在C中,有符号和无符号char
有什么区别?当我尝试在没有unsigned
的情况下运行以下代码时,它进入了一个无限循环,因为有符号字符的范围最多为127
(为什么默认情况下它是有符号的?但是当我添加unsigned
(范围高达 255(时,它工作正常。原因是什么?
#include <stdio.h>
int main() {
unsigned char x;
x = 0;
while (x <= 225) {
printf("%c=%dn", x, x);
x = x + 1;
}
return 0;
}
C 语言中没有专用的"字符类型"。 char 是一种整数类型,(在这方面(与 int、short 和其他整数类型相同。
- 它们都是整数类型。
- 它们的大小相同(一个btye(。
如果您使用数字作为字符
- 有符号字符,至少为您提供 -127 到 127 的范围。(-128 至 127 是常见的(
- 无符号字符,至少提供 0 到 255 的范围。
从 3.9.1 基本类型
纯字符、有符号字符和无符号字符是三种不同的类型。一个 字符、有符号字符和无符号字符占用相同数量的 存储并具有相同的对齐要求 (3.11(;也就是说,他们 具有相同的对象表示形式。
使用语句
x=x+1;
有几件事正在发生。
首先,将计算表达式x + 1
。这将导致通常对x
中的值进行算术转换,因此它被提升为int
。(提升的(值将增加1
,然后将结果重新分配给x
。问题从这里开始了。
因为x + 1
的结果是一个int
所以它需要转换回(signed
(char
。这是通过整数转换完成的,当从较大的有符号类型(如int
(转换为较小的有符号类型(如signed char
(时,当值无法容纳较小的类型(如尝试在signed char
中存储128
(时,行为是实现定义的。
在实践中发生的情况是,该值变为负数(该值从0x7f
增加到0x80
,这在二进制补码(负数最常见的编码(中-128
(。这进一步导致x
永远小于225
和你的无限循环。
有符号字符范围是 -128 到 127 。无符号字符范围为 0 到 255。 如果 x 变量定义为无符号字符,则 while 循环将按预期工作。
如果使用有符号字符定义变量,则变量"x"位于 -128 到 127 之间。它始终小于 255。
char
的大小为一个字节,这意味着要编码256个可能的值。signed
表示该值可以是负值或正值,在 C 标准中,声明为signed chard
的变量范围从-127
到127
unsigned
仅表示正值,这导致声明为unsigned char
的变量范围从0
到255
为了更好地理解这一点,让我们unsigned char x =-1
研究这个例子,问题是x的谷是什么?答案是x在机器中不是-1,因为编译器会将x作为char类型的正值,因此x将被255
,如果我们有unsigned char x = -2
那么x egale到254依此类推。这个例子说明了了解编译器如何在后台解释事物以及在代码执行期间得到的结果的重要性。
无符号字符仅表示:在执行算术运算时,使用最高有效位,而不是将其视为 +/- 符号的位标志。
例如,如果您使用 char 作为数字,则意义重大:
typedef char BYTE1; typedef unsigned char BYTE2;
字节 1 a; 字节 2 b; 对于变量 a,只有 7 位可用,其范围为 (-127 到 127( = (+/-(2^7 -1。对于变量 b,所有 8 位都可用,范围为 0 到 255 (2^8 -1(。
如果使用 char 作为字符,编译器将完全忽略"unsigned",就像从程序中删除注释一样。
Char 是一种数据类型,在 C 编程中用于存储字母和标点符号等字符。但是,它仍然是整数类型。这是由于 char 类型在技术上存储整数而不是字符的原因。它使用通过使用整数表示字符的数字代码 字符转换为 int 值由 C 自动完成。但是,它仍然取决于决定结果是否为负数的机器。大写字母 A 等效于整数值 65。