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 \n" , i ) ;
 9     printf( "j = %#x \n" , 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 \n" , i ) ;
 9     printf( "j = %#x \n" , 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。

还是清楚原理好呀!

时间: 2024-12-14 18:43:33

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

Initializer element is not a compile-time constant

话不多说,直接上图: 发现CGSizeMake时直接报错, 但是直接赋值就可以,这是因为初始化一个全局变量或static变量时,只能用常量赋值,不能用变量赋值! 原文地址:https://www.cnblogs.com/lijianyi/p/11518872.html

安装MySQL-python报错error: command &#39;gcc&#39; failed with exit status 1

[[email protected] MySQL-python-1.2.3]# python setup.py install function) .... _mysql.c:133: error: 'ER_SYNTAX_ERROR' undeclared (first use in this function) _mysql.c:380: error: '_mysql_ConnectionObject' has no member named 'connection' _mysql.c:382

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

全局变量 -全局变量即在函数之外定义的变量 -全局变量保存在静态存储区 注意: -全局变量只能声明和初始化 -全局变量不能进行运算.赋值(非初始化).调用函数 -否则会出现编译错误 -error: expected constructor, destructor, or type conversion before '.' token -initializer element is not constant eg: #include <stdio.h> int a = 1; int b = 2

Error loading MySQLdb module: No module named MySQLdb 错误的解决方法

具体报错如下: django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb 解法办法: 需要安装python连接mysql的模块 注意:本人使用yum install MySQL-pyton安装后依然报上错误,经测试必须要pip方式安装 pip install mysql-python 如果安装报以下错误: pip install pandas` gives

Eclipse(MyEclipse)下安装使用VSS插件

一.作用域.链接属性以及存储类型: 1.      作用域:常见作用域有代码块.文件.函数以及原型作用域(只适用于在函数原型中声明的参数名). 2.      链接属性: a)        链接可以将多个目标文件链接生成最后的目标文件.链接属性则是决定如何处理在不同文件中出现的标识符. b)        链接属性总共有三种:external(外部).internal(内部)以及none(无).默认情况下标识符一般是外部或者无属性,但是,通过static关键字,则可以改变标识符的属性,将外部属

static关键字以及字符串常量的理解

一.作用域.链接属性以及存储类型: 1.      作用域:常见作用域有代码块.文件.函数以及原型作用域(只适用于在函数原型中声明的参数名). 2.      链接属性: a)        链接可以将多个目标文件链接生成最后的目标文件.链接属性则是决定如何处理在不同文件中出现的标识符. b)        链接属性总共有三种:external(外部).internal(内部)以及none(无).默认情况下标识符一般是外部或者无属性,但是,通过static关键字,则可以改变标识符的属性,将外部属

简版服务器(c语言实现)

声明:仅个人小记 目录: (1) 简单交代及效果展示 (2) 开发日志 (3) 源代码 (4) 小结 (1) 简单交代及效果展示 环境:Ubantu 15.10 gcc5.2.1 这是一个用c语言实现的服务器(平台无所谓的,只是windows和linux的头文件有点不同,网上查阅下即可),可以充当静态网页服务器.只是静态.功能简陋,主要是学习socket通信知识. 效果展示: 1.启动服务器(server文件是编译好的可执行文件) 2.静态网页(我把它们放在同目录下的www目录下) 2.浏览器访

编译busybox-1.24.1

busybox-1.24.1.tar.bz21, 修改 Makefile找到以下2处修改为ARCH ?= armCROSS_COMPILE ?= arm-linux- 2, 打开配置菜单make menuconfig这里进行一些配置,打开 TAB 补全功能,选中 ifconfig , 打开驱动加载功能等可以按 / 后输入字符进行搜索 错误1 miscutils/i2c_tools.c: At top level:miscutils/i2c_tools.c:1046: error: `I2C_FU

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

1 百度搜索busybox进入busybox官网(https://busybox.net/)  点击左侧DownloadSource下载最新稳定版的busybox-1.24.2.tar.bz2  2 将其复制到服务器并解压缩 tar xjf busybox-1.24.2.tar.bz2 3进入根目录,在其根目录下有一个INSTALL文件告诉我们怎么使用busybox make menuconfig 什么都不设置,但要保存设置.然后执行下列指令更改CROSS_COMPILE ?=arm-linux