和编译器有关。
每种类型占用的字节数,是和编译器直接相关的,也就是常说的编译器的字长。
以整型系列的类型,char, short, int, long为例:
1 16位字长:
对于16位编译器,char占1字节,short占2字节,int占2字节,long占4字节。
2 32位字长:
对于32位编译器,char 占1字节,short占2字节,int占4字节,long占4字节。
3 64位字长:
对于64位编译器,char占1字节,short占2字节,int占4字节,long占8字节。
int型变量有时候占4个字节(在Win32),有时候占2个字节(在DOS)
这个int类型的大小到底是跟编译器有关,还是跟CPU有关,还是跟操作系统有关?
所谓的16位32位64位系统是由cpu决定的,由机器指令的寻址、寄存器位数决定的
os受cpu的限制,但在32位的cpu下16位的os也可以跑(就向上面提到的所谓纯dos)
很多os是向前兼容的,就是使以前的程序也能运行,如果编译器本身是16位时代做的,那么os会提供一个模拟16位的子环境供这个编译器使用
2. int和void*长度应该是一样的(16位的时候的20位的指针是两个16位错位加起来的) 非要转牛角尖的话,int只是语言定义里面的一个关键字,只对compiler可见,complier说它是几位就是几位,和os/cpu都没关系永远都用sizeof是最安全的办法,但sizeof只是编译时常量,不能做到二进制兼容(移植)
3 .说int和void*一样长只是因为在一般情况下它们都应该可以放到单个寄存器里,其实这样说很不确切,还是不要这样理解的好,说在xx位的cpu上int是多少位只是因为这级别的cpu有对xx位数据进行操作的单条指令(因为寄存器是xx位)(可能会有扩展指令,我不清楚,但关键看寄存器的位数),从而编译器就图个方便把int做为xx位,这也不一定的,譬如以后64位机器出来了,可能编译器只是把long扩到64位,而int还是当作32,也挺合适的
4.这也就是为什么很多程序不用int,short,long,而是自己定义int32_t, int16_t, uint32_t, ...,以后不管cpu/compiler怎么变,它只需要改改自己的typedef,是不是觉得short, unsigned short(or WORD)定义出来的就一定是16位而long, unsigned long(DWORD)定义出来的就一定是32位呢?WORD和DWORD我是相信的,因为它们是M$VC里typedef了的,剩下的不还是依赖于编译器么?
5.float存在的理由是因为存在浮点数,double存在的理由是因为需要处理精度更高的浮点数,int存在的理由是因为存在整数,long存在的理由是需要处理值域更大的整数,short存在的理由是为了节省空间处理值域较小的整数,int的意义在于当你需要定义一个循环变量(i=0; i<100; i++)的时候,你不需要费脑筋考虑到底用long还是用short,要不要加unsigned.............
标准之所以没有规定int、short、long的位数而把它们留给编译器自己决定,就是为了在硬件进化的时候编译器可以随之进化呀。
应该和操作系统有关,32位操作系统和64位操作系统int型的长度就不一样
c 语言的“标准”来自 ANSI C.
ANSI C 规定了:
short int, long int, unsigned short int, unsigned long int 型
ANSI C 没有规定 int 型
那么 int 型 到底 等于 short int 还是 long int 取决于 编译器自己。
c 语言 最早在PDP-11 unix 系统上开发, 它是 DEC产 16位计算机。short int 是 16位,long int 是 32位,
相应的 float 是 32位,double 是 64位,char 是 8位。这个标准一直被继承了下来。所以 这个标准 同 电脑和电脑操作系统无直接关系。
另一个传统是硬件存储器的单位是字节:8位。很自然,操作系统,也习惯以字节为单位。产量最多的是32位机。ANSI C 的标准,与它们 很般配。
现在开始,微机开始向 64位过渡,于是,有的编译器增加了 long long int 之类的变量。变量占多少字节取决于编译器。而编译器自身的开发书写当然 受 硬件和操作系统影响。