数据类型介绍
C语言基本内置类型
char
short
int
long
long long
float
double
类型的意义:
- 类型决定了开辟内存空间的大小
- 决定了使用范围
char
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long
float
double
以上仅仅介绍了C语言当中的一些内置类型,C语言中还有许多派生类型,由用户自己定义,如数组类型,结构体类型,指针类型等。
数据的存储
整数
数据在内存中以二进制的形式存储,对于整数来说,整数的二进制有三种表示形式:原码、反码、补码
对于正整数,原码反码补码相同,负整数的三者需要进行换算
换算过程:
- 原码:负整数的原码最高位为符号位,1为负,0为正
- 反码:在源码的基础上,符号位不变,其余按位取反
- 补码:反码 +1 得到补码
int a = -10;
整数在内存中存储的是其补码
使用补码可以将符号位与数值域统一处理;且CPU中只有加法器,使用补码时加减法可以统一处理,运算过程相同,节省硬件电路。
大端小端
- 大端存储:指数据的低位在内存的高地址中。数据的高位在内存的低地址中
- 小端存储:指数据的低位在内存的低地址中。数据的高位在内存的高地址中
在计算机存储中,以字节为单位进行存储,一个地址对应一个字节,一个字节是8bit,C语言中的数据类型存储大于1个字节时,存在字节分配问题,就出现了大端存储和小端存储。
常用的X86结构为小端模式,KEIL C51为大端模式,很多ARM和DSP都是小端模式
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;
}
int check_sys()
{
union
{
int i;
char c;
}un;
un. i = 1;
return un.c;
}
int main()
{
char a = 1;
signed char b = -1;
unsigned char c = -1;
printf("a = %d, b = %d, c = %d", a, b, c);
}
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
int main()
{
unsigned int i;
for (i = 9;i > 0; i--)
{
printf("%u\n", i);
}
return 0;
}
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
浮点数的存储规则
任意一个浮点数V可以表示成以下形式
(-1)^S*M*2^E
1. (-1)^S 表示符号位,当 S=0 时,V为正数;当 S=1 时,V为负数
2. M 表示有效数字,大于等于 1,小于 2
3. 2^E 表示指数位
-5.5(十进制) = -101.1(二进制) = -1.011 x 2^2
S = 1, M = 1.011, E = 2
- E 是一个无符号整数,如果 E 为 8 位,其取值范围为 0 ~ 255,若 E 为 11 位,其取值范围为 0 ~ 2047。
- 但实际上 E 的取值可以为负数。所以规定存入的 E 必须加上一个中间值。对于 8 位的 E,需要加上127;对于 11 位的 E,需要加上 1023。
- 取出 E 时分为 3 种情况
1)E不全为1或不全为0
E 的计算值减去加上的中间值(127 或 1023),得到其真实值,同时 M的有效数字前加上第一位 1。
2)E全为0
此时 E 等于 1-127 或 1-1023即为真实值,此时 M 不再补上第一位 1,直接还原为0.xxxxxxxxxxxx,这样可以表示±0.xxxxxxx,以及接近于0的很小的数字
3)E全为1
此时若 M 全为 0,则表示±无穷大
int main()
{
int n = 9;
float* pFloat = (float*)&n;
printf("n = %d\n", n);
printf("*pFloat = %f\n", *pFloat);
*pFloat = 9.0;
printf("n = %d\n", n);
printf("*pFloat = %f\n", *pFloat);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)