c中有符号和无符号字符之间的区别



在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的变量范围从-127127
  • unsigned仅表示正值,这导致声明为unsigned char的变量范围从0255

为了更好地理解这一点,让我们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。

相关内容

  • 没有找到相关文章

最新更新