目录:
数据类型的介绍;
整形在内存中的存储方式;
一些关于存储的练习题;
1数据类型的介绍:
char ->字符类型
short->短整形
int->整形
long->长整形
long long->超长整形
float->单精度浮点型
double ->双精度浮点型
————————————————————————————————
类型的意义
(1)创建并使用这些类型是会因为类型的不同在内存中所开辟的空间也有所不同。要合理运用。
(2)如何看待内存空间的视角。
整形家族有:
char
short
int
long
整形家族有:
float
double
构造类型有:
数组类型
结构体类型
枚举类型
联合类型
指针类型有:
char*
int *
float*
void*
2.整形在内存中的存储方式:
我们知道创建一个int类型在内存中会开辟4个字节但是它是如何存储的呢。
计算机中的有符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位
三种表示方法各不相同。
原码
直接将二进制按照正负数的形式翻译成二进制就可以。
反码
将原码的符号位不变,其他位依次按位取反就可以得到了。
补码
反码+1就得到补码。
正数的原、反、补码都相同。 对于整形来说:数据存放内存中其实存放的是补码。
这里要提一下大小端
什么大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
3.一些关于存储的练习题:
//代码1
#include <stdio.h>
int check_sys()
{
int i = 1;
return (*(char *)&i);
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0; }
通过这个代码我们可以计算出我们电脑是大端存储还是小端存储。
1.
//输出什么?
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0; }
这道题的输出结果是-1,-1,255,为什么呢,这里会进行一个整形提升,然后char类型只能访问一个字节,那么截取下来的2进制转换为整数就是这个结果,unsigned char的范围是0 ~ 255之间,不会超出这个范围,而char类型则是 -128 ~ 127 。
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0; }
这道题的输出结果是一个非常的数字因为%u输出的是无符号类型的,所以不会是负数,这个数通过char类型的整形提升二进制位是很多个1组成的所以会是一个非常大的数字。
3.
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0; }
这道题的输出结果还是一个很大的数与上题类似。
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);
这道题的输出结果则是-10。直接进行数学计算就可以了,如果是j=10;j=i+j;结果就需要计算了。
5.
unsigned int i;
for(i = 9; i >= 0; i--) {
printf("%u\n",i);
}
这道题没有输出结果,程序会err,因为无符号位的整形不会成为负数,所以for循环的判断条件始终都是成立的。
6.
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0; }
程序输出的结果是255,注意最后是strlen来计算字符串长度。
7.
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0; }
没有输出结果还是死循环,还是因为无符号char类型最大的取值范围就是255不会超出255所以循环判断始终成立。
这篇博客就到这,还有下半段会再写一篇博客来完成