c++数据类型大小

来源:百度知道 编辑:UC知道 时间:2024/05/27 07:31:20
c++数据类型大小
void main()
{

float fa=10.23f;
float* pa=&fa;
int* ia=(int*)pa;
cout<<ia<<'\t'<<pa<<endl;
cout<<*ia<<'\t'<<*pa<<endl;
cout<<sizeof(int)<<'\t'<<sizeof(long int)<<'\t'<<sizeof(unsigned long)<<endl
<<sizeof(short)<<'\t'<<sizeof(unsigned short)<<'\t'<<sizeof(float)<<endl
<<sizeof(double)<<'\t'<<sizeof(long double)<<endl;
cout<<sizeof(char)<<'\t'<<sizeof(signed char)<<'\t'<<sizeof(unsigned char)<<endl;
}

结果是:
4 4 4
2 2 4
8 8
1 1 1
可是钱能的书上说在16位机器上依次是:
2 4 4
2 2 4
8 10
1 1 1
为什么我的32位机器的long double反而比16位的精度低?
为什么32位机器不是16位机器精度的一倍?
好困惑啊!~~~~~~~

c++ primer 4th edition:
The types float, double, and long double represent floating-point single-, double-, and extended-precision values. Typically, floats are represented in one word (32 bits), doubles in two words (64 bits), and long double in either three or four words (96 or 128 bits). The size of the type determines the number of significant digits a floating-point value might contain.

根据Intel的文档的描述,双精度浮点的精度是53位,去掉1位,还有52位,总共还有12位可以给符号位以及指数位使用,符号位占据1位,剩下11位给指数位使用。而范围则是从2^(-1022)到2^(1023),换算成十进制,是2.23*10^(-308)到1.79*10^(308)

而long double本来的长度是80位,有效精度64位(实际63位),15位指数位,加上1符号位,中间还要加上一个integer bit(Intel的文档里面这么描述的),范围是2^(-16382)到2^(16383),十进制的为3.37*10(-4932)到1.18*10^(4932)。

楼主所说的问题不在于机器,而在于编译器,VC和GCC里面的long double和double其实是一样的,如果真的需要使用long double,应该要用汇编了:)

补充:汇编用long double不是说它的语法,是因为可以直接操作到80bit的寄存器,自然就可以存储long double类型的数据,如果楼主只是需要一个80bitlong double型的话可以看看这个: