一直对基本类型的cast疑惑不解,比如
#include <stdio.h>
void main(){
char x;
x='a';
printf("%c\n",x);
x=(int)x;
printf("%d",x);
}
这个时候x变量的内存发生了什么样的变化?
补充一个问题,CPU知不知道这个变量是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类型的?如果知道的话,这个标记是存在哪里的?
cpu 不知道啥类型,类型
是编程语言里的概念。
char在c里表示一个ascii字符的编号
,长度8位,也就是一个byte字节。
int 一般是32位长(4字节)。
c编译器会把各种类型的数据翻译成对应的cpu指令,cpu只是按照指令进行操作,没有数据类型的概念。
对于c语言,所有的变量都有一个内存地址,这个变量到底什么类型完全取决于你怎么解析这个变量。
对于计算机来说,引用某个变量的过程是定位到这个变量所在的内存,然后根据你的要求从这段内存中将这变量读取出来。
可以看一下union语法,可能会对你有些帮助。
内存无变化。 x=(int)x
应该被优化掉。
CPU不知道它的具体类型,这个了解一点汇编知识就可以知道。
另外,printf("%c",x);
这句里x的值倒是被赋值转移到了一个int型栈变量中,因为printf接受的变量是int型。
3 回答2.1k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答539 阅读✓ 已解决
1 回答3.3k 阅读
1 回答1.1k 阅读✓ 已解决
1 回答2.2k 阅读
你这个程序很简单,寄存器也够用。所以当你以
-Og
方式编译后你会发现:调用第一个 printf 时是这样的
调用第二个是这样的
仅仅是参数的位置变了。
你把 printf 去掉编译,就变成这样了
你看寄存器都没有变。
所以你的类型,是在编译的时候,判断的,一旦编译完了,就不再有类型了。