编写浮点型C语言程序,第三章c语言整型和浮点数型

1。c语言可移植类型:stdint.h 和 inttypes.h

#include#includeint main(int argc, char const *argv[])

{

int32_t me32;

scanf("%"SCNd32,&me32);

printf("me32 = %d\n", me32);

printf("me32 = %" PRId32 "\n", me32 );

return 0;

}

2。程序中的警告,表示的意思为:尽管编写的代码有效,但有可能不是程序猿想要的

3。计算机把浮点数分成小数部分和指数部分来表示

在计算机中将浮点数按照IEEE754标准来存储

5cff1593c54f912c3ada1da969cea43f.png

我们在将一个浮点数进行存储时,先将其转换成2进制的浮点数表示形式,随后按照图中的部位分别来进行存储。

如 float a = 3.5 这里机器中float存储为32位,所以

IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。

2d61bd24533cb0bef9c0d613f2645541.png

我们的3.5转化成二进制为11.1 = 1.11 * 2^1

则s = 0

由于M在存储的时候,规格化的浮点数要求1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。

则M = 11

E的话,首先其为无符号数,但是转化成二进制科学计数法的时候其E可能出现负数,所以需要加上一个中间值,32位数加上127,64位加上1023

则E = 1+127 = 128

所以存储的为

0 10000000 11000000 00000000 0000000

我们用程序来验证一下内存中是否是这样存储的

#includeint main(int argc, char const *argv[])

{

float a = 3.5;

printf("float = %zd\n",sizeof(float));

char *p = (char*) &a;

printf("%d\n", *p);

printf("%d\n", *(p+1));

printf("%d\n", *(p+2));

printf("%d\n", *(p+3));

return 0;

}

e838c73daa0d2eff32b64c6da3b3f674.png

由于我是小端机,所以存储的时候从低位开始存储为:

000000000 00000000 011000000 01000000

转化成十进制正好为 0 0 96 64

下图为双精度数在内存中的存储方式

c1044ce24ffb5185a494b748107d5143.png

3。c标准对基本数据类型只规定了允许的最小大小

4。c编译器在存储short的时候自动将short的值转化成int类型的值。因为int类型的值被认为是计算机处理整数类型时最高效的值。

5。char是8bit,所以如果像下面这样赋值的话

char c = 'ASD';

printf("%c\n", c);

结果为:D

想把24bit存到8bit中,8bit后面的字符会覆盖前面的,所以最后打印出来的结果只是D

6。 八进制和十六进制都是 unsigned int 类型 用%u来打印

2.0e30是double类型 科学计数法的数可以用%e来将其打印出。

7。负数的存储方式:取反加1

int a = -234

将234其转换成二进制形式,然后用比它多一位的九位数10000000 减去234的二进制形式就是-234的存储形式。

也就是传说中的:取反加一

编程练习:

一年大约有3.156*10^7秒。编程提示用户输入身高,然后以厘米为单位显示身高

#includeint main(int argc, char const *argv[])

{

long double a = 3.156e7;

long double minutes ;

int age;

scanf("%d",&age);

minutes = a * age;

printf("%Le\n", minutes);

return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值