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

 #include <stdio.h>

 float i = ;
int j = *(int *)(&i) ; int main (int argc , char *argv[])
{
printf( "i = %f \n" , i ) ;
printf( "j = %#x \n" , j);
return ;
}

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

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

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

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

解决方法一:

 #include <stdio.h>

 float i = ;

 int main (int argc , char *argv[])
{
int j = *(int *)(&i) ;
printf( "i = %f \n" , i ) ;
printf( "j = %#x \n" , j);
return ;
}

解决方法二:

对于i使用:

 #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。

还是清楚原理好呀!

initializer element is not constant 问题的更多相关文章

  1. C语言出现 "initializer element is not constant" 错误的原因

    当在全局变量定义一个指针变量,并动态分配内存后,发现竟然编译不过去,并提示 ""initializer element is not constant"": c ...

  2. [bug] C:error: initializer element is not constant

    参考 http://codingdict.com/questions/45121

  3. initializer element is not a compile-time constant

    初始化一个全局变量或static变量时,只能用常量赋值,不能用变量赋值! 如下就会报这个错误(KUIScreenWidth)是变量 static CGFloat const topButtonWidt ...

  4. 编译busybox-1.24.1 制作文件系统

    arm-linux-gcc  3.4.5 busybox-1.24.1.tar.bz21, 修改 Makefile找到以下2处修改为ARCH ?= armCROSS_COMPILE ?= arm-li ...

  5. Linux 2.4.x内核软中断机制

    http://www.ibm.com/developerworks/cn/linux/kernel/interrupt/ 软中断概况 软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执 ...

  6. C++_知识点_全局变量

    全局变量 -全局变量即在函数之外定义的变量 -全局变量保存在静态存储区 注意: -全局变量只能声明和初始化 -全局变量不能进行运算.赋值(非初始化).调用函数 -否则会出现编译错误 -error: e ...

  7. 为何gpio_to_irq不能静态使用?【转】

    之前在调试传感器模块的时候发现,在结构体声明的时候irq成员使用gpio_to_irq会报错,而动态使用的话就没有问题.就对gpio_to_irq为什么不能静态使用产生了疑问.恰巧最近又有朋友遇到了同 ...

  8. 韦东山笔记之用busybox构建根文件系统

    1 百度搜索busybox进入busybox官网(https://busybox.net/)作者:恒久力行 QQ:624668529  点击左侧DownloadSource下载最新稳定版的busybo ...

  9. 转:Linux 2.4.x内核软中断机制

    源地址:http://www.ibm.com/developerworks/cn/linux/kernel/interrupt/ Linux 2.4.x内核软中断机制 杨沙洲 (pubb@163.ne ...

随机推荐

  1. Objective-C MacOS以管理员权限执行程序

    在MacOS下非常多操作是须要管理员权限的, 比方我们执行chmod.在命令行下能够使用sudo chmod来申请以管理员权限执行.可是使用XCode写的程序是不能使用sudo的. 须要自己写代码来申 ...

  2. 安装tensorflow出现问题的解法

    在ubuntu14.04用pip安装tensorflow-gpu 安装1.3.0遇到问题 1.安装tensorflow出现Cannot uninstall 'six'.问题的解法 https://bl ...

  3. matlabr2015b安装教程

    R2015b MATLAB破解版安装教程 MATLAB和Mathematica.Maple并称为三大数学软件.它在数学类科技应用软件中在数值计算方面首屈一指.MATLAB可以进行矩阵运算.绘制函数和数 ...

  4. [Learn AF3]第三章 App Framework 3组件之Panel:afui的核心

    Panel,afui的核心组件 组件名称:Panel     使用说明:按照官方的说法,panel组件是af3的“核心(heart of the ui)”,panel用于构造应用中独立的内容展示区域, ...

  5. 【转帖】如何在redhat单机服务器上运行postgresql的多个实例(howto run multiple postgresql instance on one redhat server)

    Running multiple PostgreSQL 9.2 Instances on one server in CentOS 6/RHEL 6/Fedora 原帖网站速度很慢,故转帖在此 Thi ...

  6. EF跨库查询,DataBaseFirst下的解决方案

    出于各种原因,有时需要跨数据库访问某些数据表,有同学已经给出了解决方案,比如  http://blog.csdn.net/hanjun0612/article/details/50475800 已经解 ...

  7. 提供json格式数据,去掉引号的方法

    java文件中 String jsondata = json.toString();InputStream inputStream = new StringBufferInputStream(json ...

  8. BarTender怎么打印公式化的三列标签

    有小伙伴在业务上有这样的需求:使用BarTender打印一行三列的标签,如下A,B,C三个并排.第一行 A1=a B1=a*2-1 C1=a*2:第二行 A2=a+1 B2=(a+1)*2-1 C2= ...

  9. ispriter自动构建css-sprite

    优化你的网站: 当一个网站中的资源(比如:js文件.css文件.图片等)很多时必然影响用户访问速度,这时候你就需要做网站性能优化,你可以选择把资源分开放在不同的服务器上,因为一个资源服务器最多可以同时 ...

  10. 【jmeter】 jmeter 测试HTTP接口

    到apache官网下载jmeter:http://jmeter.apache.org/download_jmeter.cgi 1.运行 bin/jmeter.bat ,添加线程组 2.添加HTTP请求 ...