如何解决ASCII 值大于 127
#include <stdio.h>
int main() {
char c = 125;
c = c + 10;
printf("%d",c);
return 0;
}
这段代码的输出是-121
。
这个输出如何-121
?你能解释一下吗?
如果我添加 100
而不是 10
和 c
则输出为 -31
。
为什么?
解决方法
在 C 语言中,char
类型是一个 整数 类型,能够表示语言本身所需的所有字符。该标准没有指定它是有符号类型还是无符号类型。看到输出后,我可以猜测您的系统使用大小为 8 位(7 个值位和 1 个符号位)的有符号字符并以 2 补码表示负值。
所以(作为 int)125 + 10 = 135。135 > 128 所以实际值是 135 - 256 = -121。
(在二补模式下,数字只被包裹在 2**SIZE_IN_BITS...)
,它的工作原理是编译器中的类型 char
是一个 8 位宽的有符号类型,并使用称为二进制补码的系统表示整数值。
在这个系统中,正值以二进制形式从 0 到 127 如下:
00000000 0
00000001 1
00000010 2
00000011 3
... .
01111111 - 127
在下一次增量时,最高位翻转为 1:我们得到 10000000
。然后后续的二进制值在二进制补码下被解释为负数:
10000000 128 -128
10000001 129 -127
10000010 130 -126
...
11111111 255 -1
中间一列,继续从128开始计数,显示8位数据的无符号解释;它只是一直向 255 计数。这就是 unsigned char
类型的行为。
右列显示负数,是完全相同位模式的二进制补码解释。相反,它涵盖了从 -128 到 -1 的负整数范围。
现在当我们执行 c + 10
时,在 C 中会发生什么?
首先,根据 C 语言的规则,c
类型的 char
值被提升为 int
类型,它的范围要大得多。因此,int
值 125 与 int
值 10 相加,得到 int
值 135。
接下来发生的是 c
被分配了那个值,就像 c = 135
一样。但是 135
不在范围内; char
只会上升到 127
。 实现定义的行为随之而来。通过丢弃位,135
值以某种方式被迫适应。
用于二进制补码机的 C 编译器(即地球上几乎所有编译器)将较宽的整数值截断为较窄的值,只需截断值的底部位以适合较小的类型。 >
所以,135 的二进制表示是这样的。
10000111
更准确地说,假设 int
是 32 位宽。那么 int
值 135 的表示是:
00000000000000000000000010000111
通过砍掉顶部的 24 位,将其转换为 char,留下底部的 8 位:
------------------------10000111
所以我们结束了
10000111
在 char
类型中。但那是什么?参考我们原来的表格,我们可以多添加几行:
10000000 128 -128
10000001 129 -127
10000010 130 -126
10000011 131 -125
10000100 132 -124
10000101 133 -123
10000110 134 -122
10000111 135 -121 <----
...
11111111 255 -1
还有-121。
,char
类型在内存中表示为 byte
(大部分时间为 8 位),因此它可以表示从 -128
到 +127
的值。如果您尝试在内存中存储更大的值,则会导致溢出并且结果不是预期的。
Here 是一个很好的视频,解释了什么是溢出。
,char 是一个字节,即 8 位。 1 位用于符号,7 位您可以使用。
“字符”范围是: 字符 ==> -128 ~ 127
static_cast<char>(c+1) = 126
static_cast<char>(c+2) = 127
static_cast<char>(c+3) = -128
如果您使用 from "unsigned char",则增加正范围。
无符号字符 ==> 0 ~ 255
static_cast<unsigned char>(c+3) = 128
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。