当前位置:文档之家› C语言中的浮点数详细解析_华清远见

C语言中的浮点数详细解析_华清远见

C语言中的浮点数详细解析_华清远见
C语言中的浮点数详细解析_华清远见

C语言中的浮点数详细解析

什么是浮点数?浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。

本篇文章主要讲的就是C语言中的浮点数详细解析,如果你还不了解,那么务必仔细看完本篇文章,相信对你的作用会很大。

在C语言中用于存储浮点数的有两种类型,单精度float和双精度double。我们知道整形数据或者字符型数据在计算机中存储的是该数据所对应的补码。那么浮点数在计算机中如何存储的呢。无论是单精度还是双精度在存储中都分为三个部分:

1 符号位(Sign) : 0代表正,1代表为负(即浮点数没有无符号的)

2 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储(注意指数位是指数移位得到的数这部分与取值范围有关)

3 尾数部分(Mantissa):尾数部分(与有效位数有关)

其中float的存储方式如下图所示:

而双精度的存储方式为:

在分析浮点数的存储是有两个比较重要的概念需要搞清楚:1.有效位数、2.取值范围。

1:有效位数:

单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。双精度的尾数用52位存储,2^(52+1) = 9007199254740992,10^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位。

2:取值范围:

要搞清楚浮点数的取值范围必须了解指数位存储的是什么,float中指数位=128+指数,double中指数位= 1024+指数。那么float中指数的范围是-127-128。Double中指数的范围是-1023-1024。那么float 的取值范围是-2^128–2^128 即-3.4E+38–3.4E+38double的取值范围-1.79E+308-1.79E+308.

下面我们来验证一下:

我们可以将浮点数写到计算机中,然后去内存中看看浮点数如何存储。当然这种方式不是什么情况都适用,因为在有些情况下我们没有办法查看内存。那么我们可以反向思维的方式去验证。即将浮点数按照浮点数的格式存储的内存中。然后按照浮点数的方式读取出来,与之前的浮点数对比。若相同则可验证。

例:

浮点数5.5 二进制形式为101.1

转化为浮点数存储格式为:0 10000001 0110000000000000000

符号指数位尾数部分

即:0x40b00000

下面是C语言程序:

运行结果为:

以上C语言中的浮点数详细解析你是否看懂了呢?如果想要get更多资料,可以前往华清远见的官网,华清远见提供免费学习资料以供参考和学习。

c语言的sizeof函数

? ? 聚焦 ? 论坛 ? 博客 ? 来吧 ? 问答 ? 游戏 ? 品牌 ? 购物街 ? ? 登录 ? 注册 ? 社区服务 首页 > 提问列表 > 提问 c 中的sizeof 函数放在哪个头文件? [编程 数据库 ] 悬赏点数 10 3个回答 肚兜2569 2009-06-18 13:04:51 172.30.211.* c 中的sizeof 函数放在哪个头文件? 回答 登录并发表 取消 回答 jjvcd3 2009-06-18 13:05:15 59.175.191.* sizeof 是单目运算符,是关键字之一,不是函数,没有头文件 lclcug 2009-06-18 23:00:39 58.242.187.* 1.sizeof 操作符的结果类型是size_t ,它在头文件中typedef 为unsign ed int 类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof 是算符 圣斗士之家 2009-06-19 17:54:42 123.6.3.* SizeOf Pascal 的一种内存容量度量函数: 用法: Var 等您来回答 pe 的桌面文件放在哪个目录下 - 0个回答 魔兽3.0.5版本安装文件怎样放在别的磁盘? - 1个回答 psp 看电影把影片放在哪个文件里? - 1个回答 多普达领航者的历史地址放在哪个文件中 - 1个回答 艾奇mp4转换器转换完的文件会放在哪里 - 1个回答

a : array[1..10000] of longint; Begin Writeln(SizeOf(a)); End. 输出:40000 如果定义Integer,则输出:20000 c语言中判断数据类型长度符 用法 sizeof(类型说明符,数组名或表达式); 或 sizeof 变量名 1. 定义: sizeof是C/C++中的一个操作符(operator)是也,简单的说其作用就是返回一个对象或者类型所占的内存字节数。 MSDN上的解释为: The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. 其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为 typedef unsigned int size_t; 世上编译器林林总总,但作为一个规范,它们都会保证char、sig ned char和unsigned char的sizeof值为1,毕竟char是我们编程能用的最小数据类型。 2. 语法: sizeof有三种语法形式,如下: 1) sizeof( object ); // sizeof( 对象); 2) sizeof( type_name ); // sizeof( 类型); 3) sizeof object; // sizeof 对象; 所以, int i; sizeof( i ); // ok sizeof i; // ok sizeof( int ); // ok sizeof int; // error 既然写法3可以用写法1代替,为求形式统一以及减少我们大脑的负担,第3种写法,忘掉它吧!实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof 绿坝截屏文件放在哪个目 录 - 2个回答 放在桌面的文件在哪个文件夹 - 5个回答

C语言中的sizeof的理解

C语言中的sizeof的理解。。 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型sizeof使用形式:sizeof(type) 数据类型必须用括号括住。如sizeof(int)。 2、用于变量sizeof使用形式:sizeof(var_name)或sizeof var_name 变量名可以不用括号括住。如sizeof(var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。 注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 如sizeof(max)若此时变量max定义为int max(),sizeof(char_v)若此时char_v定义为char char_v[MAX]且MAX未知,sizeof(void)都不是正确形式。 三、sizeof的结果 sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 1、若操作数具有类型char、unsigned char或signed char,其结果等于1。 ANSI C正式规定字符类型为1字节。 2、int、unsigned int、short int、unsigned short、long int、unsigned long、float、double、long double类型的sizeof在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。 3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。 4、当操作数具有数组类型时,其结果是数组的总字节数。 5、共用体类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof 是这种类型对象的总字节数。 让我们看如下结构: struct{char b;double x;}a; 在某些机器上sizeof(a)=12,而一般sizeof(char)+sizeof(double)=9。 这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。 6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。 四、sizeof与其他操作符的关系 sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。 五、sizeof的主要用途 1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: void*malloc(size_t size), size_t fread(void*ptr, size_t size, size_t nmemb, FILE*stream)。 2、sizeof的另一个的主要用途是计算数组中元素的个数。例如: void*memset(void*s, int c, sizeof(s))。

最冤枉的关键字-sizeof

1.5,最冤枉的关键字----sizeof 1.5.1,常年被人误认为函数 sizeof 是关键字不是函数,其实就算不知道它是否为32 个关键字之一时,我们也可以借助编译器确定它的身份。看下面的例子: int i=0; A),sizeof(int);B),sizeof(i);C),sizeof int;D),sizeof i; 毫无疑问,32 位系统下A),B)的值为4。那C)的呢?D)的呢? 在32 位系统下,通过Visual C++6.0 或任意一编译器调试,我们发现D)的结果也为4。咦?sizeof 后面的括号呢?没有括号居然也行,那想想,函数名后面没有括号行吗?由此轻易得出s izeof 绝非函数。 好,再看C)。编译器怎么怎么提示出错呢?不是说s izeof 是个关键字,其后面的括号可以没有么?那你想想s izeof int 表示什么啊?int 前面加一个关键字?类型扩展?明显不正确,我们可以在i nt 前加u nsigned,const 等关键字但不能加s izeof。好,记住:sizeof 在计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。一般情况下,咱也 。做我的关别偷这个懒,乖乖的写上括号,继续装作一个“函数”,做一个“披着函数皮的关键字” 键字,让人家认为是函数去吧。 1.5.2,sizeof(int)*p 表示什么意思? sizeof(int)*p 表示什么意思?留几个问题(讲解指针与数组 时会详细讲解),32 位系统下:int *p = NULL; sizeof(p)的值是多少? sizeof(*p)呢?

int a[100]; sizeof (a) 的值是多少? sizeof(a[100])呢?//请尤其注意本 例。sizeof(&a)呢? sizeof(&a[0])呢? int b[100]; void fun(int b[100]) { sizeof(b);// sizeof (b) 的值是多少?}

C语言中sizeof()的用法

C语言中sizeof()的用法 2008-12-31 09:45:35.0 来源:51CTO 关键词:C语言 要参加软件研发的笔试(C/C++)几乎都会涉及到sizeof()的用法,我昨天也遇到了,有的也会,但是真正sizeof()的核心还是没有领会,今天上网,无聊中就看到了详细的sizeof()的阐述,现在分享给大家。 ------------sizeof---------------- sizeof 一般形式为:sizeof(object),也可以sizeof var_char,不过大部分programer 习惯用sizeof()。 对象可以是表达式或者数据类型名,当对象是表达式时,括号可省略。sizeof是单目运算符,其运算符的含义是:求出对象在计算机内存中所占用的字节数。一般来讲,不同的机器,运行不同的对象是不一样的,当目前几乎所有的机器都是32位,很少16位的,所以一般考试都是基于32位的window和linux的。 C语言中数据类型不多。 1.整数型的: short,int,long(我没有考虑符号问题),一般c语言书上讲,int是2个字节的,即16位,范围是-32768-32767,long是4个字节,范围是-2^32---2^32-1。当时在xp上运行sizeof(int)的时候,会output 4.这就是32位的原因。sizeof(long)也是4. 如下:#include "stdio.h" #include "string.h" #include "stdlib.h" int main() { short int sa=10; int a=10; long la=10; float f = 20; double d=20; char ch=''c''; char str[]="ABC"; char *p=str; struct str{ double d; char ch; int data; }str_wu; struct str1{ char ch; double d; int data; }str_wu1; printf("sizeof(short):%d\n",sizeof(sa)); printf("sizeof(int):%d\n",sizeof(a));

枚举大小sizeof中枚举的大小详解

至从语言开始类型就被作为用户自定义分类有限集合常量地方法被引入到了语言当中,而且一度成为中定义编译期常量地唯一方法(后来在类中引入了静态整型常量). 根据上面对类型地描述,有以下几个问题: .到底所定义出来地类型是一个什么样地类型呢? .作为一个用户自定义地类型其所占用地内存空间是多少呢? .使用类型是否真地能够起到有限集合常量地边界约束呢? .大家可能都知道类型和类型具有隐示(自动)转换地规则,那么是否真地在任何地方都可以使用类型地变量来代替类型地变量呢? . 到底所定义出来地类型是一个什么样地类型呢? 在中大家都知道仅仅有两种大地类型分类:类型(注())和类类型. 所定义地类型其实属于类型,也就是说它会参与到类型地隐示转换规则当中去,所以才会出现类型与类型之间地隐示转换现象. 那么也就是说所定义地类型不具备名字空间限定能力(因为不属于类类型),其所定义地常量子具备和类型所在名字空间相同地可见性,由于自身没有名字限定能力,所以会出现名字冲突现象. 如: { { , }; { , }; }; 上面地例子会出现、名字冲突编译时错误,原因就在于枚举子(、)是名字空间中地名字,同样在引用该中地枚举子时必须采用这样地方式进行,而不是来进行引用. 注()类型: 你可以将类型看作是一种来自外太空地用绿色保护层包装地数据类型,意为“”(译者:如果一定要译成中文,那就叫“彻头彻尾地老数据”怎么样!)这就是类型地含义. 其确切定义相当粗糙(参见标准),其基本意思是类型包含与兼容地原始数据. 例如,结构和整型是类型,但带有构造函数或虚拟函数地类则不是. 类型没有虚拟函数,基类,用户定义地构造函数,拷贝构造,赋值操作符或析构函数. 为了将类型概念化,你可以通过拷贝其比特来拷贝它们.此外,类型可以是非初始化地.b5E2R。 . 作为一个用户自定义地类型其所占用地内存空间是多少呢? 该问题就是( )等于多少地问题,是不是每一个用户自定义地枚举类型都具有相同地尺寸呢? 在大多数地位编译器下(如:、等)一个枚举类型地尺寸其实就是一个( )地大小,难道枚举类型地尺寸真地就应该是类型地尺寸吗? 其实不是这样地,在标准文档()中并没有这样来定义, 标准中是这样说明地:“枚举类型地尺寸是以能够容纳最大枚举子地值地整数地尺寸”, 同时标准中也说名了:“枚举类型中地枚举子地值必须要能够用一个类型表述”, 也就是说,枚举类型地尺寸不能够超过类型地尺寸,但是是不是必须和类型具有相同地尺寸呢?上面地标准已经说得很清楚了,只要能够容纳最大地枚举子地值地整数就可以了,那么就是说可以是、和. 例如:

详细解析sizeof()

一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它 并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可 以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用括号括住。如sizeof(int)。 2、用于变量 sizeof使用形式:sizeof(var_name)或sizeof var_name 变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。 注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类 型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确 形式。 三、sizeof的结果 sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 1、若操作数具有类型char、unsigned char或signed char,其结果等 于1。 ANSI C正式规定字符类型为1字节。 2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C

C语言标准库函数bsearch 详解

C语言标准库函数bsearch详解 (2010-11-0817:43:08) 转载 标签: 分类:C语言 it C语言中bsearch包含在头文件中,此函数可以根据你给的条件实现二分查找,如果找到元素则返回指向该元素的指针,否则返回NULL;对于有多个元素匹配成功的情况,bsearch()未定义返回哪一个。使用bsearch函数也要自己定义比较子函数。 函数原型 void*bsearch(const void*key,const void*base,size_t num,size_t size, int(*cmp)(const void*,const void*)); 解释一下参数 key指向要查找的元素 base指向进行查找的数组 num数组中元素的个数 size数组中每个元素的大小,一般用sizeof()表示 cmp比较两个元素的函数,定义比较规则。需要注意的是,查找数组必须是经过预先排序的,而排序的规则要和比较子函数cmp的规则相同。 因为使用bsearch函数要求数组预先排好序,所以该函数通常和快速排序函数(qsort)一起使用,关于qsort函数,详见《C语言标准库函数qsort详解》关于bsearch()的具体应用请见《POJ2503Babelfish C语言版》 C语言中可以用bsearch()实现二分查找。同qsort()一样,bsearch()也包含在 key指向所要查找的元素,base指向进行查找的数组,nmem为查找长度,一般为数组长度,size为每个元素所占的字节数,一般用sizeof(...)表示,comp

指向比较子函数,它定义比较的规则。需要注意的是,数据必须是经过预先排序的,而排序的规则要和comp所指向比较子函数的规则相同。如果查找成功则返回数组中匹配元素的地址,反之则返回空。对于有多于一个的元素匹配成功的情况,bsearch()未定义返回哪一个。 例:

C语言中常用函数大全

(一)输入输出常用函数 1,printf (1)有符号int %[-][+][0][width][.precision][l][h] d -:左对齐 +:正数前加‘+’ 0:右对齐,acwidth.precision,按实际输出,否者左边补零 (2)无符号int %[-][#][0][width][.precision][l][h] u|o|x|X #:”%o %x/X”输出0,0x,0X .precision:同上,TC/BC包含0x/X,VC下不包含 (3)实数输出 %[-][+][#][0][width][.precision][l][L] f|e|E|g|G #:必须输出小数点 .precision:小数位数(四舍五入) (4)字符和字符串的输出 %[-][0][width] c %[-][0][width] [.precision] s .precision:S的前precision位 2,scanf %[*][width] [l][h]Type With:指定输入数据的宽度,遇空格、Tab、\n结束 *:抑制符scanf(“%2d%*2d%3d”,&num1,&num2) 输入123456789\n;num1==12,num2==567. 注意: (1)指定width时,读取相应width位,但按需赋值 Scanf(“%3c%3c”,&ch1,&ch2)输入a bc d efg ch1==a ch2==d (2)%c 输入单字符时“空格、转义字符”均是有效字符 (二)ascll字符/字符串/文件函数 1;字符非格式化输入函数 (1)int getchar(void) 接受字符,以回车结束,回显 (2)int getc(FILE*stream) 从stream中接受字符,以回车结束,回显stream=stdin时,(1)==(2)(3)int getche(void) 直接读取字符,回显conio.h

C语言fopen等几个f函数用法

C语言函数fopen 函数简介 函数功能:打开一个文件 函数原型:FILE * fopen(const char * path,const char * mode); 相关函数:open,fclose,fopen_s[1],_wfopen 所需库: 返回值:文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。 一般而言,打开文件后会作一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。 参数说明: 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。 mode有下列几种形态字符串: r 打开只读文件,该文件必须存在。 r+ 打开可读写的文件,该文件必须存在。 rb+ 读写打开一个二进制文件,只允许读写数据。 rt+ 读写打开一个文本文件,允许读和写。 w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。(原来的EOF符不保留) wb 只写打开或新建一个二进制文件;只允许写数据。 wb+ 读写打开或建立一个二进制文件,允许读和写。 wt+ 读写打开或着建立一个文本文件;允许读写。 at+ 读写打开一个文本文件,允许读或在文本末追加数据。 ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。 上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。 有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+","w+","a+", 而用"rw","wr","ar"等,读者注意所用系统的规定。

C语言函数大全(精简版)

字符串函数?bcmp ?bcopy ?bzero ?memccpy ?memchr ?memcmp ?memcpy ?memicmp ?memmove ?memset ?movmem ?setmem ?stpcpy ?strcat ?strchr ?strcmp ?strcmpi ?strcpy ?strcspn ?strdup ?stricmp ?strlen ?strlwr ?strncat ?strncmp ?strncmpi ?strncpy ?strnicmp ?strpbrk ?strrev ?strset ?strstr ?strtok ?strupr 数学函数 ?abs ?acos ?asin ?atan ?atan2 ?ceil ?cos ?cosh ?exp ?fabs ?floor ?fmod ?frexp ?hypot ?ldexp ?log ?log10 ?modf ?pow ?pow10 ?sin ?sinh ?sqrt ?tan ?tanh 输入输出函数 ?getchar ?kbhit ?printf ?putchar 系统函数 ?exit ?itoa 字符函数 ?isalnum ?isalpha ?iscntrl ?isdigit ?islower ?isascii ?isgraph ?isprint ?ispunct ?isspace ?isupper ?isxdigit ?toascii ?tolower ?toupper 内存管理函数 ?calloc ?free ?malloc ?realloc

ctype.h 字符函数 isalnum 功能:判断字符c是否为字母或数字 说明:当c为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零。 举例: printf("%c:%s\n",c,isalnum(c)?"yes":"no"); isalpha 功能:判断字符c是否为英文字母 说明:当c为英文字母a-z或A-Z时,返回非零值,否则返回零。 举例: printf("%c: %s letter",c,isalpha(c)?"is":"not"); iscntrl 功能:判断字符c是否为控制字符 说明:当c在0x00-0x1F之间或等于0x7F(DEL)时,返回非零值,否则返回零。 举例: printf("%x:%s\n",c,iscntrl(c)?"yes":"no"); isdigit 功能:判断字符c是否为数字 说明:当c为数字0-9时,返回非零值,否则返回零。 举例: printf("%c:%s\n",c,isdigit(c)?"yes":"no"); islower 功能:判断字符c是否为小写英文字母 说明:当c为小写英文字母(a-z)时,返回非零值,否则返回零。 举例: printf("%c:%s\n",c,islower(c)?"yes":"no"); isascii 功能:判断字符c是否为ascii码 说明:当c为ascii码时,返回非零值,否则返回零。ascii码指0x00-0x7F之间的字符举例: if(isascii(s[i])) putchar('^');

如何在C语言中实现参数个数不确定的函数

如何在C语言中实现参数个数不确定的函数? C语言中有一种长度不确定的参数,形如:"...",它主要用在参数个数不确定的函数中,我们最容易想到的例子是printf函数。(注意:在C++中有函数重载(overload)可以用来区别不同函数参数的调用, 但它还是不能表示任意数量的函数参数。) C语言用va_start等宏来处理这些可变参数。这些宏看起来很复杂,其实原理挺简单,就是根据参数入栈的特点从最靠近第一个可变参数的固定参数开始,依次获取每个可变参数的地址。 在标准C语言中定义了一个头文件专门用来对付可变参数列表,它包含了一组宏,和一个v a_list的typedef声明。针对不同平台有不同的宏定义,我们选取X86平台下的宏定义: typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) ( ap = (va_list)0 ) //或者简化为 typedef char* va_list; #define va_start(list) list = (char*)&va_alist #define va_end(list) #define va_arg(list, mode)\ ((mode*) (list += sizeof(mode)))[-1] 其中说明如下: _INTSIZEOF(n)宏是为了考虑那些内存地址需要对齐的系统<从此可以看出编译器生成参数调用时,必须是满足一定的对齐规则的>. 为了能从固定参数依次得到每个可变参数,va_start,va_arg充分利用下面两点: 1. C语言在函数调用时,先将最后一个参数压入栈 2. X86平台下的内存分配顺序是从高地址内存到低地址内存 高位地址 第N个可变参数 第N-1个可变参数 ...... 第二个可变参数 第一个可变参数 ap 固定参数 v

解析C语言中的sizeof

解析C语言中的sizeof 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用括号括住。如sizeof(int)。 2、用于变量 sizeof使用形式:sizeof(var_name)或sizeof var_name 变量名可以不用括号括住。如sizeof(var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。 注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 如sizeof(max),若此时变量max定义为int max();sizeof(char_v),若此时c har_v定义为char char_v[MAX],且MAX未知;sizeof(void)都不是正确形式。三、sizeof的结果 sizeof操作符的结果类型是size_t,它在头文件 中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 1、若操作数具有类型char、unsigned char或signed char,其结果等于1。 ANSI C正式规定字符类型为1字节。

2、int(2)、unsigned int(2)、short int(2)、unsigned short(2)、long int(4)、unsigned long(4)、float(4)、double(8)、long doubl e(10)类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、12。 3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。 4、当操作数具有数组类型时,其结果是数组的总字节数。 5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的s izeof是这种类型对象的总字节数,包括任何垫补在内。 让我们看如下结构: struct{char b;double x;}a; 在某些机器上sizeof(a)=12,而一般sizeof(char)+sizeof(double)=9。 这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。(sizeof(char)(4) +sizeof(double)(8))=12; 6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。 四、sizeof与其他操作符的关系 sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量.(*,/,% 为?级的运算符) 五、sizeof的主要用途

c语言函数

用递归法将一个正整数n的各个数字分别输出int f(int num) { int x; if(num==0) return 0; else{ x=num%10;

f(num/10); } 穷举实例 int main() { int n=1,m,sum,i; while(1) { m=n; sum=0; for(i=1;i<8;i++) { m=m*2; sum=m+sum; } sum=sum+n; if(sum==765) { cout<<"fist"<

break; } n++; } return 0; } 宏定义可以定义函数例如交换函数swap #Define swap(a,b){int c;c=a;a=b;b=c;} 简单结构体成员号码姓名 #include "StdAfx.h" #include"stdio.h" #include"string.h"

#include"iostream" using namespace std; struct student { int num; char name[50]; struct student *next; }; struct student *creat(int n) { int i; struct student *head,*p1,*p2; int num1; char name1[50]; head=NULL; for(i=n;i>0;--i) { p1=(struct student* )malloc(sizeof(struct student)); cout<<"输入编号";

C语言文件操作函数大全(超详细).docx

fopen (打开文件) 相关函数open, fclose 表头文件#include 定义函数FILE * fopen (const char * path, const char * mode); 两数说明参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流 形态。 mode有下列几种形态字符串: r打开只读文件,该文件必须存在。 r+打开可读写的文件,该文件必须存在。 w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。 w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。 a+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 复制代码代码如下: r Open text file for reading. The stream is positioned at the beginning o f the file. r+ Open for reading and writing. The stream is positioned at the beginning of the file. w Truncate file to zero length or create text file for writing? The strea m is positioned at the beginning of the file. w+ Open for reading and writing? The file is created if it does not exist, otherwise it is truncatod? The stream is posi -

C语言sizeof用法

SIZEOF用法 C语言中判断数据类型长度符 用法 sizeof(类型说明符,数组名或表达式); 或 sizeof 变量名 1. 定义: sizeof是C/C++中的一个操作符(operator)是也,简单的说其作用就是返回一个对象或者类型所占的内存字节数。 MSDN上的解释为: The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. 其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为 typedef unsigned int size_t; 世上编译器林林总总,但作为一个规范,它们都会保证char、signed char和unsigned char的sizeof值为1,毕竟char是我们编程能用的最小数据类型。 2. 语法: sizeof有三种语法形式,如下: 1) sizeof( object ); // sizeof( 对象); 2) sizeof( type_name ); // sizeof( 类型); 3) sizeof object; // sizeof 对象; 所以, int i; sizeof( i ); // ok sizeof i; // ok sizeof( int ); // ok sizeof int; // error 既然写法3可以用写法1代替,为求形式统一以及减少我们大脑的负担,第3种写法,忘掉它吧!实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof值都是一致的。这里,对象可以进一步延伸至表达式,即sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。如: sizeof( 2 ); // 2的类型为int,所以等价于sizeof( int ); sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价于sizef(double) 也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用,我们来看一个完整的例子: char foo() { printf("foo() has been called.\n"); return 'a';

C语言中重要的实现函数

1.在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。答:main() {char str[5],max; int I; scanf(“%s”/n,str); max=str[0]; for(I=1;I<5;I++) {if strcmp(str[0],str[I])<0; max=str[I]; else max=str[0]; } printf(“%s”,max); } 2.整数转换成字符串。 #include int main(){ char a[] =”123456”; int b = atoi(a); printf(“%d\n”,b); return 0; } #include #include int main(){ char a[] = "12345"; int b = strlen(a); int i,j=0,k = 1; for (i = b - 1;i >= 0;i--){ j += (a[i]-'0')*k; k*=10; } printf("%d\n",j);} 3.字符串转换成整数。 #include #include int main(){ int a = 12345,i = 0; int c = a; char arr[10]={}; for(i = 0;;){

i++; a/=10; if(a == 0)break;} arr[i] = '\0'; i--; for(i;i>=0;i--){ arr[i] = c%10+'0'; c/=10; } printf("%s\n",arr); return 0; } 1、strcmp int strcmp(const char *str1, const char *str2); 比较两个字符串,返回整数值的意义如下: ? 1,str1 大于 str2; ? 0,str1 等于 str2; ? -1,str1 小于 str2; int a_strcmp(const char *str1,const char *str2) { while(*str1) { if(*str1!=*str2) return (*str1-*str2)>0 ? 1 : -1 ; str1++; str2++; } if(*str2) return -1; else return 0; } 2、strcat char *strcat(char *str1, const char *str2); 把 str2(包括'\0')拷贝到 str1 的尾部(连接),并返回str1。其中终止原 str1 的'\0'被str2的第一个字符覆盖。 char* scat(char *str1,const char *str2){ char *str = str1; while(*str){ str++; } while(*str2){

C语言函数大全(c开头)

C语言函数大全(c开头) 函数名: cabs 功能: 计算复数的绝对值 用法: double cabs(struct complex z); 程序例: #include #include int main(void) { struct complex z; double val; z.x = 2.0; z.y = 1.0; val = cabs(z); printf("The absolute value of %.2lfi %.2lfj is %.2lf", z.x, z.y, val); return 0; } 函数名: calloc 功能: 分配主存储器 用法: void *calloc(size_t nelem, size_t elsize); 程序例: #include #include int main(void) { char *str = NULL; /* allocate memory for string */

str = calloc(10, sizeof(char)); /* copy "Hello" into string */ strcpy(str, "Hello"); /* display string */ printf("String is %s\n", str); /* free memory */ free(str); return 0; }

1、快速锁屏 现代人的电脑充满了各种商业机密与隐私,上班时间喝个茶水都害怕电脑被“偷窥”。电脑它自己也会保护自己哦,只要你离开之前按下快捷键:Windows+L,就能快速锁住电脑屏幕哦,妈妈再也不用担心我的机密泄露了 2、误删恢复 字打多了就容易手抖,尤其做文案的,有时候忙得眼花缭乱却一不小心把文字为误删了。只要你未清空回收站,就能按快捷键:Ctrl+Z,进行撤回恢复。

相关主题
文本预览
相关文档 最新文档