第三章c语言整型和浮点数型

1。c语言可移植类型:stdint.h 和 inttypes.h
#include<stdio.h>
#include<inttypes.h>

int 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标准来存储

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

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

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

我们的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

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

#include<stdio.h>

int 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;
}


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

000000000 00000000 011000000 01000000

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

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

在这里插入图片描述

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秒。编程提示用户输入身高,然后以厘米为单位显示身高

#include<stdio.h>

int 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;
}

猜你喜欢

转载自blog.csdn.net/qq_37414405/article/details/85119359