当把一个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类型的?如果知道的话,这个标记是存在哪里的?

阅读 6.5k
7 个回答

你这个程序很简单,寄存器也够用。所以当你以 -Og 方式编译后你会发现:

调用第一个 printf 时是这样的

mov $0x64, %edi

调用第二个是这样的

mov $0x1, %edi
mov $0x6,4 %edx

仅仅是参数的位置变了。

你把 printf 去掉编译,就变成这样了

mov $0x64, %edi

你看寄存器都没有变。

所以你的类型,是在编译的时候,判断的,一旦编译完了,就不再有类型了。

cpu 不知道啥类型,类型编程语言里的概念。

char在c里表示一个ascii字符的编号,长度8位,也就是一个byte字节。
int 一般是32位长(4字节)。

c编译器会把各种类型的数据翻译成对应的cpu指令,cpu只是按照指令进行操作,没有数据类型的概念。

  1. x 的内存没有发生变化

  2. 不知道

新手上路,请多包涵
  1. x的内存变量没有发生任何变化。
  2. 不知道

对于c语言,所有的变量都有一个内存地址,这个变量到底什么类型完全取决于你怎么解析这个变量。
对于计算机来说,引用某个变量的过程是定位到这个变量所在的内存,然后根据你的要求从这段内存中将这变量读取出来。
可以看一下union语法,可能会对你有些帮助。

内存无变化。 x=(int)x应该被优化掉。
CPU不知道它的具体类型,这个了解一点汇编知识就可以知道。

另外,printf("%c",x);这句里x的值倒是被赋值转移到了一个int型栈变量中,因为printf接受的变量是int型。

在 CPU 哪里只有 0 和 1 的

Why

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题