Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
char数据类型的循环性质_C - Fatal编程技术网

char数据类型的循环性质

char数据类型的循环性质,c,C,我一直在学习C,遇到了一个主题,叫做C中数据类型的循环性质 这就像一个例子 char c=125; c=c+10; printf("%d",c); 输出为-121。 给出的逻辑是 125+1= 126 125+2= 127 125+3=-128 125+4=-127 125+5=-126 125+6=-125 125+7=-124 125+8=-123 125+9=-122 125+10=-121 这是由于char数据类型的循环性质造成的。煤焦是否具有循环性质??如何在您的系统上使用char

我一直在学习C,遇到了一个主题,叫做C中数据类型的循环性质

这就像一个例子

char c=125;
c=c+10;
printf("%d",c);
输出为-121。 给出的逻辑是

125+1= 126
125+2= 127
125+3=-128
125+4=-127
125+5=-126
125+6=-125
125+7=-124
125+8=-123
125+9=-122
125+10=-121
这是由于char数据类型的循环性质造成的。煤焦是否具有循环性质??如何在您的系统上使用char???

,char是有符号的char。当有符号整数类型溢出时,结果是未定义的。它可能是循环的,也可能不是循环的。尽管在大多数执行2的补码运算的机器上,您可能会发现这是循环的。

根据您的实现,char数据类型是有符号类型。因此,它可以存储范围:-128到127的值。当您存储的值大于127时,最终的值可能是负数或正数,这取决于存储的值有多大以及您使用的平台类型。 有符号整数溢出在C语言中是未定义的行为,但并不是所有的无符号数都能保证环绕。

字符在这方面并不特别,除了它的实现定义的有符号性之外,所有到有符号类型的转换通常都表现出这种“循环性质”。但是,有符号溢出还有未定义和实现定义的方面,所以在执行这些操作时要小心

这里发生了什么:

在表达式中

c=c+10
+的操作数需要进行通常的算术转换。它们包括整数提升,如果其类型的所有值都可以表示为int,则将所有值转换为int。这意味着,+c的左操作数转换为int,int可以保存每个字符值1。添加的结果具有int类型。赋值隐式地将该值转换为char,该值恰好在您的平台上签名。8位有符号字符不能保存值135,因此它以实现定义的方式2进行转换。用于:

对于转换为宽度N的类型,该值被减少到模2N,以在该类型的范围内;没有发出任何信号

您的字符宽度为8,28是256,135☰ -121 mod 256 cf.例如

您没有说您使用哪种编译器,但是对于所有编译器来说,行为应该是相同的。实际上,已经没有任何非2的补码机器了,对于2的补码,这是我能想到的唯一合理的有符号转换定义

请注意,此实现定义的行为仅适用于转换,而不适用于任意表达式中的溢出,例如

int n = INT_MAX;
n += 1;
是未定义的行为,某些编译器将其用于优化,例如,通过优化这些语句,因此绝对应该避免此类情况

第三种情况与此无关,但为了完整性起见,是无符号整数类型:不会发生溢出。但是,也有例外,例如,位移位超过类型的宽度,对于精度为N的类型,结果总是减少为模2N

相关的:

1至少用于8位字符、有符号字符或精度高于字符的整数,因此几乎总是如此


2 C标准说C99和C11 n1570 6.3.1.3 p.3“[…]要么结果是实现定义的,要么产生了实现定义的信号。”在这种情况下,我不知道有哪个实现会产生信号。但最好不要在不阅读编译器文档的情况下依赖这种转换。

我不知道您提到的数据类型的循环性质。对您所描述的内容的解释称为溢出我知道这是一种溢出,但该主题被解释为数据的循环性质type@shashank然后你要么扔掉,要么烧掉你正在读的书。@shashank不要读教程谢谢你我终于明白了不要盲目相信某事+的操作数被提升了以使加法不会溢出。返回到char的转换是实现定义的,或者引发了一个实现定义的信号,我想大多数编译器都像gcc一样定义它,其中转换如问题所示。字符类型可能取决于有符号或无符号实现,有符号字符的最小范围为-127到127,在2s补码系统中工作的大多数系统上为-128到127。@MohitJain字符数据类型是实现定义的,但根据OP的问题和代码输出,很明显,这是在他的政纲上签字的。仍然更新了答案以反映此结构。+1现在更清楚了。