• initializer element is not constant 问题


    在Ubuntu下,比葫芦画瓢,写了一个程序,居然报错!!!!

     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 
    " , i ) ;
     9     printf( "j = %#x 
    " , j);
    10     return 0;
    11 }

    对于高手,一眼就能看出其中的问题,不过对标准C语言不是很明白的可能就搞不清楚了。

    编译,gcc -o text text.c、./text,出现如下错误:

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

    其中原因在于: C语言初始化一个全局变量或static变量时,只能用常量赋值,不能用变量赋值上面的代码第3行的i是个变量,于是第4行出错。这里注意,即使第3行用const int a = 100,编译器也视a为变量。

    解决方法一:

     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 
    " , i ) ;
     9     printf( "j = %#x 
    " , j);
    10     return 0;
    11 }

    解决方法二:

    对于i使用:

    1 #define i 3

    不过这就失去了我的本意了,你懂的~

    好吧,这个程序是验证浮点型在内存中,如何表示的,以下为转载,互联网就是伟大!!!

    单精度浮点数: 1位符号位   8位阶码位   23位尾数

    双精度浮点数: 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。

    还是清楚原理好呀!

  • 相关阅读:
    Android sdk 下载路径
    centos修改用户用户组
    centos7 通过shell切换root用户
    java 服务上传图片到linux没有读写权限
    Mybatis第二天
    Mybatis第一天
    反射
    注解
    多线程第二天
    java---过滤器、监听器
  • 原文地址:https://www.cnblogs.com/laojie4321/p/4251215.html
Copyright © 2020-2023  润新知