我正在学习编程。我们只介绍了变量。我们被告知他们引用内存中的地址。该地址的大小是多少?也就是说,地址13221和地址13222是否用8位分隔? 16吗32?每个位都有地址吗?
如果大小不同,具体大小是否由硬件确定?磁盘格式?操作系统?编译器/解释器?
如果我只在16位空间中存储一个字节的数据,那该如何实现?是否通过将最左边的8位默认设置为0来完成,就像通过以10为基数的比较将“ 12”写为“ 0012”一样?大小是否可以灵活地利用那些未使用的存储空间?
答案 0 :(得分:0)
对于某些方面,您的问题过于广泛,因为内存布局首先取决于硬件,然后取决于操作系统的限制,然后取决于编译器,最后取决于您编写的软件。在Intel / AMD平台中,地址指向特定字节。每个再见由8位组成。英特尔和平台都是低位字节序,因此最低有效位在前。
寄存器是硬件的基本“变量”。寄存器大小固定。当您存储的字节数少于寄存器的大小时,由您决定发生什么事情:您使用的硬件指令确定是扩展符号位还是重置其余位...
当您在一个宽的变量中存储少量变量时,编译器将根据操作数的类型选择适当的硬件指令来执行您所要求的操作。因此,您可以将字节5存储在int32变量中:编译器将使用“字节到字节”存储指令,该指令会将所有额外的3个字节设置为零。
答案 1 :(得分:0)
地址13221和地址13222是否用8位分隔? 16吗32?
8位,几乎总是
每个位都有一个地址吗?
否,仅字节。一种使用其他方法来获取特定位的值。
如果大小不同,具体大小是否由硬件确定?磁盘格式?操作系统?编译器/解释器?
大小没有变化,并且很大程度上取决于硬件。
如果我只在16位空间中存储一个字节的数据,那该如何实现?是否通过将最左边的8位默认设置为0来完成操作,例如通过基数10比较将'12'写为'0012'?
我并没有真正理解16位空格的含义。如果您考虑使用2字节的内存,则每个字节都有一个地址(就像在每个内存中一样),如果写入了一个字节,则将其写入计算机给定的地址。因此,在16位内存中,地址0和1有两个字节。
但是也许你的意思是“如果我有16位字的地址,然后用它写一个字节,它将写在哪里?”。 实际上,这取决于计算机。在某些计算机中,单词的地址是其最低有效字节的地址(它们被称为
char
的地址上写一个字节(在C语言中short
),使程序不可移植,并且强烈建议不要这样做,除非您真的知道你做什么。如果正确考虑了数据类型,则不必担心字节在内存中的排列方式。
大小是否可以灵活地利用那些未使用的存储空间?
计算机为变量分配空间。根据变量的类型,您会保留特定的空间。例如,在C中,char
被存储在一个字节中,{short
被存储在两个字节中,int
在大多数情况下被存储在4个字节中,等等。这确保了无论得到什么值如果该变量遵守其类型的约束(例如unsigned char
必须在0到255之间),它将被正确地写入内存。因此它不是“未使用”的空间。添加“灵活性”将使内存管理完全不可行。