能力值:
( LV3,RANK:25 )
26 楼
int 变量
是给编译器看的,也就是你的C++,为什么要定义呢
因为他是防止内存溢出问题的, int 4个字节 他就只读4个字节
文本是00结尾 他就读到有00结尾的为直
能力值:
( LV2,RANK:10 )
27 楼
电脑不知道,它只知道要从内存里取多少个字节的数据,是什么结构类型它才不会理你,字节的多少由你的代码和编译器共同决定
能力值:
( LV2,RANK:10 )
28 楼
首先我是看汇编来了解这个问题的
计算机不关心内存中数据是什么类型,他只是从入口函数一条一条执行指令,而所谓的变量是命令中的操作数而已。对于计算机,保存的全局变量,会放到指定的位置,cpu通过内存的偏移访问,临时变量,就是堆栈存储。。。
能力值:
( LV2,RANK:10 )
29 楼
其实电脑啥都不懂 是我们以为它懂了 因为是我们让它这么干的 总结一下就是: 约定了什么就是什么
比如你家的电话号码, 你问电话机怎么知道这是电话号码呢?
能力值:
( LV2,RANK:10 )
30 楼
CPU是不会知道你定义那些类据是啥的,至于它为什么可以正确的使用,其实取决于你你代码里怎么使用,如果你定义了一个变量但代码里没有地方使用,编译完了基至都不会真的产生此变量,直接就给干掉了。比如你定义了一个整型A ,赋了A某个其它变量的地址,然后把A强转成指针使用,这个你代码里肯定得有体现,所以是你代码告诉CPU怎么使用A这个变量对应的这片内存数据的。
能力值:
( LV2,RANK:10 )
31 楼
一段代码编译了是有执行的入口地址的。入口地址指向的内容就是指令。从此处的指令开始执行。如果没有转跳指令就会一直顺序执行,知道执行到ret指令。有转跳指令则转跳,转跳后继续执行有ret返回。
至于程序中使用的数据,比如变量,全局变量是编译器编译代码的时候将变量的数据定义在了数据段,代码中使用的此全局变量的地方被编译器翻译成了一个地址,指向了变量的数据。而对不同的类型的区分的,这个工作不是CPU做的,而是编译器做的。比如win32下int型数据是4字节,在高级语言中比如C语言中操作一个变量时,编译器编译成机器指令时,会对应读取指向变量地址处4字节的内容。机器指令你可以理解为汇编指令。至于计算器是如何在一段二进制数据中识别一个指令的长度的的话,这个你可以参考计算机组成原理相关课程中的内容。
能力值:
( LV2,RANK:10 )
32 楼
这个解释很详细,再想刨根就是模拟电路和数字电路了
能力值:
( LV3,RANK:20 )
33 楼
你说的这些都是代码处理的事情。。。
硬件自己是不知道的,硬件只知道执行代码。。。
代码被执行后才会处理数据。。。
不如你的int,电脑是不知道的,对于CPU来说int就是32比特串,只有程序里面的算法才知道如何使用这个int。
你反汇编一下不就全看明白了?
能力值:
( LV3,RANK:20 )
34 楼
因为你写的程序把它当作了int,或者当作了struct,或者当作*p啊,这都是你指定的。。。
程序实际上是程序员意志的体现,他决定了硬件如何运行,淡然了前提是硬件可以办到。。。
能力值:
(RANK:110 )
35 楼
这楼主问的问题。。。电脑不是一个主体,它没有自我意识的,真正赋予它理解数据意义的是你的程序代码,说白了,电脑不知道数据是啥,它是个呆逼。人工智能到现在还没有真正有革命性的突破,自我学习和自我理解还专属于人类。说白了,你的问题应该改为,程序是怎么知道数据是int而不是其他的。因为程序是你写的,你定义的。
能力值:
( LV2,RANK:10 )
36 楼
等学习了汇编语言,知道内存寻址方式就知道了。
混kxb 转正式会员
能力值:
( LV2,RANK:10 )
37 楼
应该是看你程序怎么访问的吧
能力值:
( LV2,RANK:15 )
38 楼
楼主,上面的坛友说的都对,电脑当然不会知道这是什么,这种问题不太好解释清楚,建议楼主空闲时间稍微看一点点汇编,自然就懂了
能力值:
( LV2,RANK:10 )
39 楼
CPU 不是看数据是什么,他只看指令是什么,指令是叫他怎么做他就怎么做,
比如:
这里面111是一个数据
eax = 111;
mov ebx, eax
ebx = 111;
这里111已经是地址了
eax = 111;
mov [eax], 1
mov ebx, eax
ebx = 111;
这两个结果都是一样的,他告诉我们一个道理CPU不管eax里面是数据也好,地址也好,他只根据指令执行就行了
能力值:
( LV2,RANK:10 )
40 楼
我跟LZ有过相同的疑问,后来给自己找了个解释,不知道是不是对楼主的疑惑也适用。
我们假设32位机器,int占4字节。
假设内存从0000号开始,做如下定义int a = 332;假定a的地址是0123,那么CPU取指令的时候怎么确定要取4个字节呢? 我理解是这样的从0000到0122这些位置填充了各种各样的数据和指令,有的是char,考虑数据对齐,机器码读取4字节,有的是double,机器码读取8字节等等等等,读到第0122位置的时候,刚好结束了,再读下一个数据,机器码“约束”CPU读取4个字节。至于这4个字节是什么东西,CPU根本不知道的,CPU只是按照程序指令(机器码)从0123位置开始读起,并且读取的数据是4个字节,不会多,也不会少。下一次读取,就从0124开始,假如double b = 1.23;b存储在0124位置,那么编译器编译这段代码的时候,形成的机器码就会要求CPU从0124位置读取,并且读取8个字节,然后在从0126位置读取(读取多少字节依然由编译的程序约束,并且这个约束是从地址0000就开始的,一直延续到整个系统内存地址的最后一处,所有的约束都严格而不能出错)...依次进行下去,在这个过程中,由程序编译成的机器码约束CPU不对出现 “比如读取0123位置的后2个字节和0124位置的前两个字节” 这种错误 当然,这只是我个人理解,是不是正确也不知道。
原先我还有一种理解,后来想想是行不通的:每一块内存都有一个关于其类型和长度的描述符。后来我发现,这样做太浪费了。
能力值:
( LV2,RANK:10 )
41 楼
先要指明你所在的层次,cpu本身不知道一段数据是什么,放地址寄存器就是地址,放数据寄存器就是数据。至于这数据是什么,就需要程序怎么看待了,比如两个数相加,溢出啊还是不溢出啊,这要看你程序的了,cpu只计算了一次,只有一个结果,人类就可以看成两个结果,有符号和无符号。你妹,真神奇。
你就是人,猪就是猪,造物主说你们都是坨肉而已。
能力值:
( LV9,RANK:140 )
42 楼
cpu是死的,程序是活的。CPU只知道将操作数按指令的要求进行处理,cpu眼里只有寄存器指令和内存单元。
你也说了,某一个数它可能是一个整数,也可能是一个对象。举个例子,老师在黑板写了个整数“10”,收银员在发票上也写了个整数“10”,老师眼里这是一个数字10,收银员眼里这是十块钱。这里,纸和笔知道这个“10”的含义吗?不知道!但是老师和收银员知道。这里的纸和笔可以看做CPU,老师和收银员分别看做两个不同的程序。再拿个程序里的例子,有一个内存单元里放了一个整数“100”,同时另一个内存单元里也有一个对象指针,指针里的地址用整数表示也是一个整数“100”,这两个内存单元里的值本质上是完全相同的。然后有两段程序,一段程序读取前者的值100乘以2然后输出到屏幕。另一段程序读后后一个内存单元的值100作为某个类的内存地址,然后加上一个成员变量的偏移地址,读取其成员变量的值到屏幕。在这不同的程序里,这相同的值在这里也就呈现出不同的意义,但是对CPU来讲这值还是100。于是可以说,一个值由对其的操作赋予其类型的意义。
汇编层面来说:
mov word ptr ds:[0],1
mov byte ptr ds:[0],1
ds:[0]是同一个内存地址,但是两条不同的指令,赋予其不同的意义,一个是字,一个是字节,操作的结果也是不同的。
这样的设计其实是对我们程序员的极大的恩赐,一方面强调了CPU的原子性,降低了CPU的复杂性,另一方面CPU对数据赋予的含义越少,给上层程序开拓的想象空间也就越大!
此外还有一些动态类型的脚本语言(python 。。。)可以举例。楼主对这类问题还搞不太清楚,就不多讲了。
其实这类问题大多数新手都会遇到,但是随着对程序的了解加深,这类问题也会逐渐清晰,不必太过于纠结,建议多写点程序多分析代码。以上也是我乱吠的,欢迎指正!
能力值:
( LV2,RANK:10 )
43 楼
=-=感觉我的智商完全插不上话......
能力值:
( LV3,RANK:20 )
44 楼
所以需要有程序员
能力值:
( LV2,RANK:10 )
45 楼
其实我觉得楼主的问题可以归纳为:“指令和数据均以二进制代码形式放在主存中,CPU如何区别它们是指令还是数据?”
比如同样的二进制信息,不同的解释可以有不同的意思。
例如:
1000100111011000->89d8(数据)
1000100111011000->mov ax,bx(指令)
而这就导致了一个问题,那么计算机是如何分辨它是指令还是数据呢?
其实这涉及到了组成原理的内容,计算机可以从时间和空间两方面来区分指令和数据,在时间上,计算机在读取指令时把从存储器中读到的信息都看成指令,而在读取数据的时候则把从存储器里读到的信息都看成操作数。在空间上,从内存中取出指令送控制器,而执行周期从内存从取的数据送运算器、往内存写入的数据也是来自于运算器。(这是组成原理书上的一段话)
更确切一点,CPU区分指令和数据的依据是指令周期的不同阶段,在取指周期中取出的是指令字,在间址周期或者执行周期中取出的是数据 。
楼主可以补一下计算机组成原理的知识或许会更好理解一点。