当把一个char类型转换成int型的时候计算机里究竟而发生了什么?

发布于 2022-09-05 20:13:26 字数 277 浏览 26 评论 0

一直对基本类型的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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

情愿 2022-09-12 20:13:26

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

调用第一个 printf 时是这样的

mov $0x64, %edi

调用第二个是这样的

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

仅仅是参数的位置变了。

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

mov $0x64, %edi

你看寄存器都没有变。

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

绅士风度i 2022-09-12 20:13:26

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

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

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

君勿笑 2022-09-12 20:13:26
  1. x 的内存没有发生变化

  2. 不知道

不寐倦长更 2022-09-12 20:13:26
  1. x的内存变量没有发生任何变化。
  2. 不知道

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

蓝天 2022-09-12 20:13:26

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

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

塔塔猫 2022-09-12 20:13:26

在 CPU 哪里只有 0 和 1 的

Why

几度春秋 2022-09-12 20:13:26

cpu 是不管你源码文件里的数据类型的,它只认指令和地址。
所以打印char的时候,它用一个load byte的指令去在x地址的位置读取一个字节;
打印int的时候,它用一个load word的指令在x地址的位置读取4个字节。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文