initializer element is not constant 問題

在Ubuntu下,比葫蘆畫瓢,寫了一個程序,竟然報錯!!!!spa

 1 #include <stdio.h>
 2 
 3 float i = 3;
 4 int j = *(int *)(&i) ;
 5 
 6 int main (int argc , char *argv[])
 7 {
 8     printf( "i = %f \n" , i ) ;
 9     printf( "j = %#x \n" , j);
10     return 0;
11 }

對於高手,一眼就能看出其中的問題,不過對標準C語言不是很明白的可能就搞不清楚了。code

編譯,gcc -o text text.c、./text,出現以下錯誤:blog

1 text.c:4: error: initializer element is not constant

其中緣由在於: C語言初始化一個全局變量或static變量時,只能用常量賦值,不能用變量賦值上面的代碼第3行的i是個變量,因而第4行出錯。這裏注意,即便第3行用const int a = 100,編譯器也視a爲變量。內存

解決方法一:element

 1 #include <stdio.h>
 2 
 3 float i = 3;
 4 
 5 int main (int argc , char *argv[])
 6 {
 7     int j = *(int *)(&i) ;
 8     printf( "i = %f \n" , i ) ;
 9     printf( "j = %#x \n" , j);
10     return 0;
11 }

解決方法二:編譯器

對於i使用:it

1 #define i 3

不過這就失去了個人本意了,你懂的~io

好吧,這個程序是驗證浮點型在內存中,如何表示的,如下爲轉載,互聯網就是偉大!!!編譯

單精度浮點數: 1位符號位   8位階碼位   23位尾數class

雙精度浮點數: 1位符號位   8位階碼位   52位尾數

 

實數在內存中以規範化的浮點數存放,包括數符、階碼、尾數。數的精度取決於尾數的位數。好比32位機上float型爲23位       double型爲52位。

單精度float型存儲在內存中的大小爲4個字節,即32位。

浮點表示的通常形式爲:R=M*2^e (R:Real       M:Mantissa尾數     e:exponent階碼)

把上面float的二進制可分紅三部分:

   x                   xxxxxxxx             xxxxxxxxxxxxxxxxxxxxxxx

數符(1b)         階碼(8b)         尾數(23b)

double型的浮點數分別是:數符(1b)、階碼(8b)、尾數(52b)

數符sign:real的正負號     "+":0        "-":1

階碼e:e=E-127(double型中e=E-1023) e爲正值說明這個浮點數向左移動了e位, e爲負值說明這個浮點數向右移動了e位。127=2^7-1 1023=2^10-1

尾數M:有效數字位,這裏是有效數字位的部分二進制碼

例1:float型浮點數125.5轉化成32位二進制浮點數

125.5的二進制碼爲1111101.1,寫成二進制的科學計數爲:1.111101*2^6(由於科學計數法「整數」部分大於1,在二進制中,「整數」部分只能恆爲1)即向左移6位,則e=6,則E=e+127=133,而E的二進制碼爲10000101,而1.111101把「整數」部分去除1以後爲111101,以後補0,共23b,造成了階碼。

因此125.5的32位二進制浮點數爲

0 10000101 11110100000000000000000

例2:float型浮點數0.5轉化成32位二進制浮點數

0.5的二進制碼爲0.1,寫成二進制的科學計數爲:1.0*2^(-1)即向右移1位,則e=-1,則E=e+127=126,而E的二進制碼爲01111110,而1.0把「整數」部分去除1以後爲0,以後補0,造成了階碼。

 

因此0.5的32位二進制浮點數爲

0 01111110 00000000000000000000000

double型浮點數相似。

例3:32位二進制浮點數爲0 10000010 00010000000000000000000轉化成十進制數浮點數

題中已給咱們分了三部分,數符部分、階碼部分、尾數部分。

數符部分爲0,則表明此數爲正數;階碼部分爲10000010,則E=130,則e=E-127=3,則說明其向左移了3位,0001加上「整數」部分的1以後,爲1.0001。則原二進制數爲1000.1=十進制8.5,或R=1.0001*2^3=8.5。

仍是清楚原理好呀!

相關文章
相關標籤/搜索