当把一个char类型转换成int型的时候计算机里究竟而发生了什么?
一直对基本类型的cast疑惑不解,比如
#include <stdio.h>
void main(){
char x;
x='a';
printf("%c\n",x);
x=(int)x;
printf("%d",x);
}
这个时候x变量的内存发生了什么样的变化?
补充一个问题,CPU知不知道这个变量是char类型的还是int类型的?如果知道的话,这个标记是存在哪里的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
你这个程序很简单,寄存器也够用。所以当你以
-Og
方式编译后你会发现:调用第一个 printf 时是这样的
调用第二个是这样的
仅仅是参数的位置变了。
你把 printf 去掉编译,就变成这样了
你看寄存器都没有变。
所以你的类型,是在编译的时候,判断的,一旦编译完了,就不再有类型了。
cpu 不知道啥类型,
类型
是编程语言里的概念。char在c里表示一个ascii字符的
编号
,长度8位,也就是一个byte字节。int 一般是32位长(4字节)。
c编译器会把各种类型的数据翻译成对应的cpu指令,cpu只是按照指令进行操作,没有数据类型的概念。
x 的内存没有发生变化
不知道
对于c语言,所有的变量都有一个内存地址,这个变量到底什么类型完全取决于你怎么解析这个变量。
对于计算机来说,引用某个变量的过程是定位到这个变量所在的内存,然后根据你的要求从这段内存中将这变量读取出来。
可以看一下union语法,可能会对你有些帮助。
内存无变化。
x=(int)x
应该被优化掉。CPU不知道它的具体类型,这个了解一点汇编知识就可以知道。
另外,
printf("%c",x);
这句里x的值倒是被赋值转移到了一个int型栈变量中,因为printf接受的变量是int型。在 CPU 哪里只有 0 和 1 的
Why
cpu 是不管你源码文件里的数据类型的,它只认指令和地址。
所以打印char的时候,它用一个load byte的指令去在x地址的位置读取一个字节;
打印int的时候,它用一个load word的指令在x地址的位置读取4个字节。