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

时间:2017-07-21 06:18:21

标签: c char signed unsigned-char

C中有符号和无符号char有什么区别?当我尝试在没有unsigned的情况下运行以下代码时,它进入了一个无限循环,因为signed char的范围最多为127(为什么默认情况下会签名?)。但是当我添加unsigned(其范围高达255)时,它可以正常工作。是什么原因?

#include <stdio.h>

int main() {
    unsigned char x;
    x = 0;
    while (x <= 225) {
         printf("%c=%d\n", x, x);
         x = x + 1;
    }
    return 0;
}

6 个答案:

答案 0 :(得分:3)

C语言中没有专用的“字符类型”。 char是一个整数类型,与int,short和其他整数类型相同(在这方面)。

  • 它们都是整数类型。
  • 他们有相同的尺寸(一个btye)。

如果您使用数字作为字符

  • 签名字符,至少为您提供-127到127范围。 (-128到 127很常见)
  • 无符号字符,为您提供至少0到255范围。

从3.9.1基本类型

  

Plain char,signed char和unsigned char是三种不同的类型。一个   char,一个签名的char和一个unsigned char占用相同的数量   存储并具有相同的对齐要求(3.11);就是他们   具有相同的对象表示。

答案 1 :(得分:3)

声明

x=x+1;

发生了一些事情。

首先评估表达式x + 1。这将导致x中的值usual arithmetic conversion,因此它变为promoted to an int。 (提升)值将增加1,然后结果将分配回x。这里出现了问题。

由于x + 1的结果是int,因此需要将其转换回(signedchar。这是通过integer conversion完成的,当从较大的签名类型(如int)转换为较小的签名类型(如signed char)时,该值无法适应较小的类型类型(如尝试将128存储在signed char中),行为是实现已定义

在实践中会发生的是,该值变为否定(该值从0x7f增加到0x80two's complement-128 (负数最常见的编码))。这进一步导致x永远小于225 和无限循环。

答案 2 :(得分:1)

签名字符范围是-128到127。无符号字符范围是0到255。 如果x变量定义为unsigned char。

,则while循环将按预期工作

如果使用signed char定义变量,则变量'x'位于-128到127之间。它始终小于255。

答案 3 :(得分:1)

  • char的大小为一个字节,表示256个可能的代码值。
  • signed表示值可以是negatif或positif,在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等等。这个例子是理解编译器如何在后台解释事物以及在代码执行期间得到的结果的重要性。

答案 4 :(得分:0)

unsigned char只表示:使用最高有效位而不是在执行算术运算时将其视为+/-符号的位标志。

如果你使用char作为数字,那么它很重要:

typedef char BYTE1; typedef unsigned char BYTE2;

BYTE1 a; BYTE2 b; 对于变量a,只有7位可用,其范围是(-127到127)=(+/-)2 ^ 7 -1。对于变量b,所有8位都可用,范围为0到255(2 ^ 8 -1)。

如果使用char作为字符,编译器会完全忽略“unsigned”,就像从程序中删除注释一样。

答案 5 :(得分:0)

Char是一种数据类型,在C编程中用于存储字母和标点符号等字符。但是,它仍然是一个整数类型。这是因为char类型在技术上存储整数而不是字符。它使用通过使用整数表示字符的数字代码 将char转换为int值由C自动完成。但是,它仍然依赖于决定结果是否为负的机器。大写字母A相当于整数值65.