我们知道它取决于机器或编译器......但为什么以及如何?
答案 0 :(得分:2)
对于初学者来说,机器的体系结构(比如16位或64位)将决定地址总线的宽度,并且可以有效地确定您可以访问多少内存,而无需借助虚拟内存等技巧。
通常,CPU内部的硬件寄存器与大多数架构的其余部分具有相同的位宽;所以在32位CPU上,以32位块加载和存储数据通常是最有效的。在某些环境中,甚至必须将所有数据在32位边界上对齐,即您无法从字节地址不能被4整除的存储器地址中获取数据。
可以绕过软件中的所有这些限制,但对于最有效的程序,您将希望编译器的数据类型与系统硬件密切相关。
答案 1 :(得分:1)
这取决于您所引用的语言。大多数情况下,它是关于该机器上寄存器的大小,无论它们是32位长还是64位长,或者是不同的东西。任何数据类型的值必须在低级操作时存储在寄存器中,因此在进行计算时最好利用机器的本机寄存器长度。
有些语言可以保证某些数据类型具有特定的指定大小,例如Matlab中的 int8,int16,int32,int64 类型及其大小方面的.NET平台等价物
答案 2 :(得分:0)
数据类型的大小取决于许多因素,包括语言,机器架构等。
对于具有与体系结构相关的数据类型(如C)的语言,变体是机器的字大小(寄存器大小)的结果。例如,在C / C ++中,long
整数的大小在32位机器上是4字节(32位),在64位机器上是8字节(64位)。
答案 3 :(得分:0)
因为并非所有机器都有32位寄存器。有些有64个,有些有8个。允许编译器选择一个更适合目标处理器的大小。
答案 4 :(得分:0)
它们通常独立于架构
MS .net byte
和SQL tinyint
总是8位无符号等。
答案 5 :(得分:0)
这也取决于语言。
某些语言会定义特定的数据类型大小。例如,.NET指定int 必须为32位宽,短必须为16,而long必须为64。
C和C ++采取相反的方法。它们只是保证int必须至少和short一样大,而long必须至少和int一样大。在此之后,编译器可以自由选择目标平台上最有效的大小。
不同的CPU处理不同的数据大小或多或少有效。旧(或小型,嵌入式)CPU可能没有32位宽的寄存器,因此添加两个32位值可能需要将数据拆分为多个16位寄存器,并执行多次添加 - 这需要更多时间。
其他人有64位寄存器,可以像32位一样快地执行64位加法。有些可能根本没有硬件支持16位加法,然后可能会引入额外的指令来屏蔽数据的高位,这又会变慢。
因此,C和C ++只是为了选择CPU可以高效工作的数据类型而设计的。如果我在C ++中声明一个int
类型的变量,我不知道它到底有多大,但是我做知道它的大小会超出CPU的大小可以有效地处理。