在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. Kilo 版 Keystone 数据库结构

    在安装完keystone并利用keystone-manage命令同步数据库后,mysql(我使用的存储后端)中新加了如下表: +------------------------+ | Tables_i ...

  2. python_smtplib

    import smtplib smtpserver = 'smtp.qq.com' fromaddr = 'fromaddr@qq.com' toaddrs = 'toaddr@qq.com' msg ...

  3. PolymiRTS 数据库- miRNA SNP数据库

    背景: miRNA通过和mRNA的3'UTR区结合,导致mRNA讲解或者抑制mRNA翻译,从而实现转录后调控的作用: 如果在miRNA和 mRNA的结合区域,发生了snp,就可能会影响miRNA和mR ...

  4. c#中//注释和///注释的区别 智能注释 显示换行

    ///会被编译,//不会所以使用///会减慢编译的速度(但不会影响执行速度)///会在其它的人调用你的代码时提供智能感知 也是一种注释,但是这种注释主要有两种作用:1.这些注释能够生成一个XML文件. ...

  5. 干货分享 超炫丽的HTML5/jQuery应用及代码

    今天我们要来分享一些HTML5干货,对于前段开发者来说,这些HTML5应用和jQuery插件将会让你的项目更加生动和炫丽,至少在UI设计方面,或多或少会带给你一点设计灵感,赶紧收藏和分享吧.另外这些H ...

  6. 让小区运营再智能一点,EasyRadius正式向WayOs用户提供到期弹出式提示充值页面

    其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么 ...

  7. 有限状态机(FSM)的Java 演示

    本文从简单的样例入手,逐步演变成很复杂的程序. 在简明 状态模式(5.8)中,状态之间的变换由外界控制,或者说.多种状态是切割的.无关的.状态模式最有趣的地方正是讨论其状态的变迁. 1.引子 空调(a ...

  8. 在Android平台下搭建PhoneGap开发环境--用HTML5开发游戏

    一.在Android平台下搭建PhoneGap开发环境具体怎么搭建我这里就不详细说了,如有需要我后面再讲 . PhoneGap 官方地址有详细说明:http://www.phonegap.com. 在 ...

  9. 11gR2 RAC:更换OCR、votedisk

    要点: ocrconfig 备份-恢复 ocrconfig 导出-导入 crsctl querry css votedisk crsctl replace votedisk {+dsikgroup|s ...

  10. nginx 配置虚拟主机的三种方法

    nginx,一个server标签就是一个虚拟主机. 1.基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站 2.基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管 ...