Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中有符号字符和无符号字符之间的差异_C_Char_Signed_Unsigned Char - Fatal编程技术网

c中有符号字符和无符号字符之间的差异

c中有符号字符和无符号字符之间的差异,c,char,signed,unsigned-char,C,Char,Signed,Unsigned Char,C语言中有符号字符和无符号字符的区别是什么?当我尝试在没有未签名的情况下运行以下代码时,它进入了一个无限循环,因为签名字符的范围达到了127(为什么默认情况下它是有签名的?)。但是当我添加了unsigned(其范围最大为255)时,效果很好。原因是什么 #include <stdio.h> int main() { unsigned char x; x = 0; while (x <= 225) { printf("%c=%d\n",

C语言中有符号字符和无符号字符的区别是什么?当我尝试在没有
未签名的情况下运行以下代码时,它进入了一个无限循环,因为签名字符的范围达到了
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;
}
#包括
int main(){
无符号字符x;
x=0;
而(x在C语言中没有专用的“字符类型”。char是一种整数类型,与int、short和其他整数类型相同

  • 它们都是整数类型
  • 它们有相同的大小(一个字节)
如果您使用数字作为字符

  • 有符号字符,它至少为您提供-127到127范围。(-128到127) (这很常见)
  • Unsigned char,它至少提供0到255的范围
从3.9.1基本类型

纯字符、有符号字符和无符号字符是三种不同的类型 字符、有符号字符和无符号字符占用相同数量的 存储和校准要求相同(3.11);即 具有相同的对象表示形式


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

如果使用有符号字符定义变量,则变量“x”位于-128到127之间。它始终小于255。

语句

x=x+1;
发生了一些事情

首先,将计算表达式
x+1
。这将导致
x
中的值的增加,因此它变为。将(提升的)值增加
1
,然后将结果分配回
x
。问题从这里开始

由于
x+1
的结果是一个
int
,因此需要将其转换回(
signed
char
。这是通过将较大的有符号类型(如
int
)转换为较小的有符号类型(如
signed char
)来完成的,而较小的类型无法容纳该值(就像试图将
128
存储在
签名字符中一样)行为是由实现定义的

实际情况是,该值变为负值(该值从
0x7f
增加到
0x80
,即
-128
(负数最常见的编码))。这进一步导致
x
永远小于
225
,并导致无限循环。

  • char
    的大小为一个字节,表示要编码的256个可能值
  • signed
    表示值可以是negatif或positif,在C标准中,声明为
    signed chard
    的变量的范围从
    -127
    127
  • unsigned
    仅表示正值,这导致声明为
    unsigned char
    的变量范围从
    0
    255

为了更好地理解这一点,让我们检查一下这个例子
无符号字符x=-1
,问题是x的值是多少?答案是x在机器中不是-1,因为编译器会将x作为char类型的正值,因此x将是
255
,如果我们有
无符号字符x=-2
,那么x将变为254,依此类推。本例说明了理解编译器如何在后台解释内容以及代码执行过程中得到的结果的重要性。

无符号字符的简单含义是:在执行算术运算时,使用最高有效位,而不是将其视为+/-符号的位标志

如果您使用char作为数字,则它很重要,例如:

typedef字符字节1; typedef无符号字符字节2

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


如果使用字符作为字符,“unsigned”当注释从程序中删除时,编译器会完全忽略它。

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

Huh?您刚才解释了主要区别(有符号字符变为127,无符号变为255)但是你会问区别是什么。如果纯
char
是有符号的还是无符号的是实现定义的。也就是说,两个不同的编译器可能有不同的地方。@M.M这是唯一的区别吗?它们在其他方面都一样吗?更重要的是,在我使用gcc的windows 10笔记本电脑上,它们生成不同的汇编语言说明。可能其中一个更快/更小。差异已在上一个问题中解释过。我们是否要再次提供完全相同的答案?
char
无符号char
、和
有符号char
被称为字符类型。(这些也是整数类型)这些是最小范围,可能更大。但是,
signed char
的最小范围是[-127127]根据定义,
char
的大小为一个字节,但一个字节不必是8位。您声明的范围是标准保证的最小范围。@DavidBowling:实际上,
char
类型的最小范围是255个值,而不是256个值。实际上,在非2的补码系统上,
char\u MIN
可以是
-127
。我们我知道这一点(正如你对另一个answ的评论)