目录
1. 数据类型介绍
数据的基本的内置类型有:
类型的意义:
1.使用这个类型开辟内存空间的大小(大小决定了使用范围)
2.如何看待内存空间的视角
1.1类型的基本归类:
整形家族:
浮点型家族:
flaot double
只要表示小数就可以使用浮点型
float的精度低,存储的范围较小,double的精度高,存储的数据范围更大。
构造类型(自定义类型)
数组类型
结构类型(struct)
枚举类型(enum)
联合类型(union)
指针类型:
int* pi;
char* pc
float* pf
void* pv
空类型
void表示空类型(无类型)
通常应用于函数的返回类型,函数的参数,指针类型。
void test(void)
{
printf("hello\n");
}
int main()
{
test;
return 0;
}
第一个void表示,函数不会返回值。
第二个void表示,函数不需要任何参数。
2.整形在内存中的存储
2.1 原码、反码、补码
计算机中的整数有三种2进制表示方法,即原码,反码,补码。
1,正的整数,原码,反码,补码,相同。
2,负的整数,原码,反码,补码是需要计算的。
原码:直接通过正负的形式写出的二进制序列就是原码
反码:原码的符号位不变,其它位按位取反得到的就是反码
补码:反码+1就是补码
整数在内存中存放的是补码的二进制序列
int main()
{
int a = 10;
//10
//00000000000000000000000000001010 ———原码
//0x00 00 00 0a ——每4个二进制位写成一个十六进制位
//00000000000000000000000000001010 ———反码
// 0x00 00 00 0a
//00000000000000000000000000001010 ———补码
//0x00 00 00 0a
int b = -10;
//-10
//10000000000000000000000000001010 ———原码
//0x80 00 00 0a ——每4个二进制位写成一个十六进制位
//11111111111111111111111111110101 ———反码
//0xff ff ff f5
//11111111111111111111111111110110 ———补码
//0xff ff ff f6
retrun 0;
}
在计算机中数值一律采用补码来表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理。
同时加法和减法也可以统一处理(CPU只有加法器)此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路。(原码可以看成是补码的补码)
例如
计算机在计算1-1时,是这样计算的。
它把1-1看成1+(-1),然后把它们的补码相加。
1的补码:00000000000000000000000000000001
-1的补码:11111111111111111111111111111111
相加:100000000000000000000000000000000 ——33位最高位舍去
最终得到:00000000000000000000000000000000
2.2大小端介绍
练习
百度2015年系统工程师笔试题:
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)
思路:
int main()
{
int a = 1;
char* b = &a;
if (*b == 0)
{
printf("大端\n");
}
else
{
printf("小端\n");
}
return 0;
}
2.
求打印的a,b,c
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;
}
这里char和signed char表示的都是有符号的字符类型所以结果是一样的
所以答案是:-1,-1,255
3.
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
4.
int main()
{
char a = -128;
printf("%d\n", a);
return 0;
}
5.
int main()
{
char a = 128;
printf("%u\n", a);
return 0;
}
6.
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
7.
int main()
{
unsigned int i=0;
for (i = 9; i >= 0; i--)
{
printf("%u/n", i);
return 0;
}
}
输出:9,8,7,6,5,4,3,2,1,0,2的32次方-1,2的32次方-2,……死循环。
8.
int main()
{
char a[1000];
int i=0;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d\n", strlen(a));
return 0;
}
9.
unsigned char i = 0;
//unsigned char 类型的取值范围是0~255
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
}
return 0;
}
i不可能大于255,程序死循环。