繁体   English   中英

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

[英]Difference between in signed and unsigned char in c

C中有符号和无符号char什么区别? 当我尝试运行以下代码且未unsigned它进入了无限循环,因为已签名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;
}

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

  • 它们都是整数类型。
  • 它们具有相同的大小(一个btye)。

如果您将数字用作字符

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

从3.9.1基本类型开始

普通字符,有符号字符和无符号字符是三种不同的类型。 一个char,一个已签名char和一个未签名char占用相同的存储量,并具有相同的对齐要求(3.11); 也就是说,它们具有相同的对象表示形式。

与声明

x=x+1;

有一些事情正在发生。

首先将对表达式x + 1求值。 这将导致x值的常规算术转换 ,因此它升为int (提升的)值将增加1 ,然后将结果分配回x 问题就从这里开始。

因为x + 1的结果是一个int所以需要将其转换回一个(带signedchar 这是通过整数转换来完成的,当值不能适合较小的类型(例如尝试将128存储在一个有signed char )时,则从较大的有符号的类型(如int )转换为较小的有符号的类型(如signed char )来完成。行为是实现定义的

在实践中发生的是该值变为负数 (该值从0x7f增大到0x80 ,即2的补码-128 (最常见的负数编码))。 这进一步导致x 永远小于225从而导致无限循环。

带符号的char范围是-128到127。 无符号字符范围是0到255。如果x变量定义为无符号字符,则while循环将按预期工作。

如果使用带符号的char定义变量,则变量'x'介于-128到127之间。它始终小于255。

  • 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,依此类推。 这个例子对理解编译器如何在后台解释事物以及我们在代码执行过程中得到什么结果的重要性。

无符号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”。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM