c++ - 在 C++ 中将 int 转换为 char 时“缩小”如何工作?
问题描述
我是 C++ 的初学者,有一个关于转换的问题。将 int 转换为 char 值时,当 ASCII 表上超过 127 时会发生什么?
例如,
using namespace std;
int main()
{
double d = 0;
while (cin>>d){
int i = d;
char c = i;
int i2 = c;
cout<<"d=="<<d<<endl;
cout<<"i=="<<i<<endl;
cout<<"c=="<<c<<endl;
cout<<"i2=="<<i2<<endl;
cout<<"char:("<<c<<")"<<endl;
}
}
现在如果使用输入 150,当 i = d 时 i 变为 150,当 c = i 时 c 变为 û,这对我来说意味着 int 150 = char û
但是当 int i2 在屏幕上输出时,假设 int i2 将 char c 转换回整数,i2 == 106
我的假设是 int i2 也是 150。
如果有人可以向我解释这一点,我将不胜感激,因为我正在努力掌握这个概念。我读过,因为 char 可以保存 1 个字节的信息,而 int 可以保存 4 个字节的信息,所以该值是“缩小的”。但是,我不完全确定这意味着什么!
解决方案
在 C++ 中将 int 转换为 char 时“缩小”如何工作?
整数类型的宽度大致是它包含的字节数(或位数)。因此,如果一种类型具有较少的字节(或位),则它比另一种类型更窄。
考虑一个物理表现int
——它是一张索引卡,上面标有八个盒子,我们可以在每个盒子里写一个数字。也许它会被其中一个自动光学系统读取,但无论如何,我们不允许在那里挤更多的数字或在盒子外面写。
现在,我们有一张代表 a 的等效卡片char
- 它上面标记了两个框。
该char
卡也可以在物理上更窄,以真正打出类比,但重要的是您只能写两位数。
因此,以 10 为基数,一张int
卡可以存储 0-99,999,999,而一张char
可以存储 0-99。
现在,我给你一张写int
有号码的卡片123
,请你把数值复制到char
卡片上。你能做什么?您可以丢弃不适合的百位数字,然后写23
. 或者我猜你可以惊恐地举起双手拒绝。通常我们希望计算机做前者。
这是一个狭窄的转换。char
物理上太小(窄),无法容纳可以包含的所有信息int
。
最后,为了描述实际的int
和char
类型,我们可以使用二进制(在这种情况下,我们只能使用数字0
和1
,int
卡片有 32 个盒子,而char
卡片有 8 个),或者我们可以让索引卡片保持相同的大小如果我们以 16 为基数而不是 10 为基数写我们的数字。
有符号还有一个更复杂的问题int
,因此我们还需要用固定位数表示负值。char
可以签名或未签名 - 它取决于实现。如果您有兴趣,可以查找二的补码,这是存储有符号值的最常见方式,但通常您可以存储的值的一半将是负数。
粗略地说,缩小转换可能做错事的两种方式是:
- 较窄的类型只是没有足够的数字,所以有些被切断了
- 较窄的类型可以适合所有数字,但有符号,并且该特定模式表示窄类型中的负数(假设它在宽类型中为正)
推荐阅读
- c++ - 如何输出给定向量中给定最小值和最大值之间的元素数
- c# - 错误找不到资源 ID #0xffffffff
- python-3.x - Zoho Bulk Write API 在文件上传时出现异常错误“http.client.RemoteDisconnected:远程结束关闭连接没有响应”
- c++ - 如何使用 dmabuf 与 OpenGL ES 实现零拷贝行为?
- autocomplete - 如何通过 React-Admin 在 ReferenceInput 中使用 AutocompleteInput
- django - django.core.exceptions.FieldError 的不支持查找“搜索”
- android - Android Native Module:如何从原生 Android Activity 回到 React Native?
- go - 翻转计数器
- postgresql - 将角色组授予角色没有从 postgres 中的角色组继承配置
- sql - 如何从 Tarantool 上的“任何”/“地图”数据类型进行查询?