c - 当我们从较低的数据类型类型转换到较高的数据类型时会发生什么
问题描述
内存空间的可访问性会改变还是只是通知编译器采用上述类型的变量?
例子:
int main()
{
char a;
a = 123456789;
printf("ans is %d\n",(int)a);
}
输出:
overflow in implicit constant conversion a= 123456789.
ans is 21.
在这里我知道它为什么会导致溢出。但我想知道发生溢出时如何访问内存。
解决方案
这有点简单:由于char
通常只保存一个字节,因此只有一个字节123456789
会被复制到a
. 究竟如何取决于 if char
is signed
or unsigned
(它是特定于实现的)。有关确切的详细信息,请参见例如此整数转换参考。
通常发生的情况(我没有看到任何编译器有任何不同)是值的最后一个字节被复制,未经修改,进入a
.
对于123456789
,如果您查看值的十六进制表示,它将是0x75bcd15
。在这里你可以很容易地看到最后一个字节是0x15
十进制21
的。
int
当您打印该值时printf
,强制转换会int
发生什么实际上不会发生int
...... 你的printf
电话完全等于
printf("ans is %d\n",a);
推荐阅读
- javascript - 如何在 React 中发出 AJAX 请求?
- php - 如何显示来自 JSON 结果的单个结果
- swift4 - 如何使用 ARKit 更准确地测量距离?
- php - 使用 JSON 的数据库连接
- scala - 如何更新数组列?
- android - 如何在单击按钮时使用 Glide 将图像保存到存储中?
- java - Java Servlet:强制初始化在 Payara 服务器启动时创建数据对象?
- apache-spark - Cassandra/Spark 读取性能
- php - 如何使用子字符串检查 $_POST
- javascript - 如何在将文本附加到 div 时将 onclick 中的文本引用为 onclick=" '+var+' "