装潢公司企业网站源码,网站建设运营思路,南充市住房和城乡建设厅官方网站,页面模板资源目录
一、数据类型的介绍
1.类型的意义#xff1a;
2.类型的基本分类
二、整形在内存中的存储
1.原码 反码 补码
2.大小端介绍
3.练习
三、浮点型在内存中的存储
1.一个例子 2.浮点数存储规则 一、数据类型的介绍
前面我们已经学习了基本的内置类型以及他们所占存储…目录
一、数据类型的介绍
1.类型的意义
2.类型的基本分类
二、整形在内存中的存储
1.原码 反码 补码
2.大小端介绍
3.练习
三、浮点型在内存中的存储
1.一个例子 2.浮点数存储规则 一、数据类型的介绍
前面我们已经学习了基本的内置类型以及他们所占存储空间的大小 char //字符数据类型 short //短整型 int //整形 long //长整形 long long //更长的整形 float //单精度浮点型 double //双精度浮点型 1.类型的意义 1.使用这个类型开辟内存空间的大小大小决定了使用的范围 2.决定了如何看待内存空间的视角 int 和float类型都是4个字节但是一个是整形一个是浮点型看待内存空间的视角不一样 2.类型的基本分类
(1)整形家族 char unsigned char signed char short : unsigned short [int] //短整型这个int整形可以省略 signed short [int] int : unsigned int signed int long : unsigned long [int] signed long [int] 【温馨提示】char类型也是整形家族的原因 字符在内存中存储的是字符的ACSII码值0-127ASCII码值是整形所以字符类型归类到整形家族 signed -有符号的当第一位代表符号位的时候就是有符号的 unsigned -无符号的当每一位都是数值位有效位的时候就是无符号的 【注意】 当我们没有写signed和unsigned时intshort和long类型默认就是signed有符号的 eg当我们写出int a的默认的其实就是signed int类型 but C语言并没有规定char是否是signed char这个取决于编译器大部分是signed char (2)浮点数家族都可以表示小数 float //精度小一些单精度 double //精度大一些双精度 (3)构造类型自定义类型 数组类型 结构体类型 struct 枚举类型 enum 联合类型 union (4)指针类型 int *pi char *pc float *pf void * pv (无具体类型的指针 (5) 空类型 void 表示空类型无类型 通常应用于函数的返回类型函数的参数指针类型 egint mainvoid就表示main函数不需要参数
但是实际上main函数是有三个参数的int main(int argc,char *argv[ ],char *envp[ ]),这三个参数需要用的时候才需要写不需要括号直接写void即可
二、整形在内存中的存储 计算机能够处理的是二进制数据整形和浮点型在内存中也都是以二进制的形式进行存储的 1.原码 反码 补码
整形的二进制表示有三种原码反码补码 正的整数原码反码补码相同 负的整数原码反码补码要进行计算 整数在内存中存储的是补码的二进制序列 eg int a -10;//int类型占4个字节-32bit位 10000000 00000000 00000000 00001010 原码 11111111 11111111 11111111 11110101 反码 1 1111111 11111111 11111111 11110110 补码最高一位表示符号位其他31位表示数值位 unsigned int b -10; 1 1111111 11111111 11111111 11110110 补码32位全都表示数值位 对于整形来说数据存放内存中其实存放的是补码 为什么呢 使用补码可以将符号位和数值域统一处理同时加减法也可以统一处理cpu只有加法器此外补码和原码相互转换其运算过程是相同的不需要额外的硬件电路 eg 1-1 电脑转化为1(-1) 00000000 00000000 00000000 00000001 1的原反补码 10000000 00000000 00000000 00000001 -1的原码 11111111 11111111 11111111 11111110 -1的补码 11111111 11111111 11111111 11111111 -1的补码 如果就是简单的原码相加得到的就是-2还会犹豫要不要加符号位 但是如果是补码相加得到的就是正确的结果每个位上不断进1最后最前面多出来一位为1直接舍弃其他位都为0 2.大小端介绍
int a0x11223344根据数据的存储44位于低字节处11位于高字节处
大端字节序存储 把一个数据的低位字节处的数据存放在内存的高地址处高位字节处的数据存放在内存的低地址处 小端字节序存储 把一个数据的低位字节处的数据存放在内存的低地址处高位字节处的数据存放在内存的高地址处 【注意】数据存放的时候是以字节为单位存储讨论顺序的所以叫做大小端字节序存储 char类型不需要考虑大小端char类型就占一个字节没有顺序可言 为什么存在大小端字节序存储呢 这是因为在计算机系统中我们是以字节为单位的每个地址单元都对应着一个字节一个字节为8 bit。但是在C语言中除了8 bit的char之外还有16 bit的short型32 bit的long型要看具体的编译器另外对于位数大于8位的处理器例如16位或者32位的处理器由于寄存器宽度大于一个字节那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式 百度笔试题: 请简述大端字节序和小端字节序的概念设计一个程序来判断当前机器的字节序 思路 给一个int类型的变量a让其为1这样十六进制简单0x 00 00 00 01然后再通过char*一次访问一个字节打印出来看是00还是01从而判断大小端 代码实现
#includestdio.h
int main()
{int a 1;char* p (char*)a; //要将aint *强制转化为char *if (*p 1)printf(小端\n);elseprintf(大端\n);return 0;
}
【自定义函数进行判断】
#includestdio.h
int check_sys()
{int a 1;return *(char*)a;
}
int main()
{if(check_sys()1)printf(小端\n);elseprintf(大端\n);return 0;
} 3.练习
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
解释 首先-1是整数原码10000000 00000000 00000000 00000001 反码111111111 111111111 111111111 111111110 补码111111111 111111111 111111111 111111111 但是char类型只有8个比特位所以补码存起来就是111111111而且第一位为符号位对于a和b %d是10进制的形式打印有符号的整数 那么就需要进行整形提升无符号数高位补0有符号数高位补符号位对原码整形提升 对于a和b整形提升后补码为111111111 111111111 111111111 111111111也就是-1 对于c整形提升后补码为00000000 00000000 00000000 111111111又因为是无符号的整形补码和原码一样也就是255 2下面程序输出什么
#include stdio.h
int main()
{char a -128;printf(%u\n, a);return 0;
}
答案
4294967168
解释 -128的原码10000000 00000000 00000000 10000000 反码111111111 111111111 111111111 011111111 补码111111111 111111111 111111111 10000000 存进a的补码100000001为符号位 对a进行整形提升111111111 111111111 111111111 10000000有符号位高位补符号位1 %u是10进制的形式打印无符号的整数 那么打印就当a是无符号数打印对于无符号数原反补码相同直接算即可 3下面程序输出什么
#include stdio.h
int main()
{char a 128;printf(%u\n, a);return 0;
}
答案
4294967168
解释
虽然signed char最大只能是127但是还是可以赋值为128可以自行截断 128的原码00000000 00000000 00000000 10000000 存进a的补码100000001为符号位 对a进行整形提升111111111 111111111 111111111 10000000有符号位高位补符号位1 10进制无符号形式打印 【总结】 signed char-128~127 char-假设是有符号的char1个字节8bit 第一位为符号位第一列为原码 00000000 0 00000001 1 00000010 2 00000011 3 ... ... 011111111 127 10000000 -128 11111111反 110000000补多出来一位要删去 10000001 -127 11111110 111111111 ... 111111110 -2 10000001 10000010 111111111 -1 10000000 10000001 假设是unsigned char0~255 00000000 00000001 1 00000010 2 00000011 3 ... 011111111 127 10000000 128 ... 111111110 254 111111111 255 4下面程序输出什么
int i -20;
unsigned int j 10;
printf(%d\n, ij);
答案
-10
解释 -20原码10000000 00000000 00000000 00010100 反码111111111 111111111 111111111 11101011 补码111111111 111111111 111111111 11101100 10原反补码00000000 00000000 00000000 00001010相加时最高位变为符号位 补码进行相加111111111 111111111 111111111 11110110补码 反码10000000 00000000 00000000 00001001 原码10000000 00000000 00000000 00001010-10 5下面程序输出什么
unsigned int i;
for(i 9; i 0; i--)
{
printf(%u\n,i);
}
答案
9到0再到4294967295一直减小死循环
解释
unsigned int的范围就是0的所以for循环的判断条件恒成立类比unsigned char当0继续减小就到了255unsigned int也是这样的 6下面程序输出什么
int main()
{
char a[1000];
int i;
for(i0; i1000; i)
{
a[i] -1-i;
}
printf(%d,strlen(a));
return 0;
}
答案
255
解释 strlen是统计\0也就是0之前的字符个数 a[ i ]里面放的是-1-2-3...-128 127 ...6 5 4 3 2 1 0 一共就是128127255个数 7下面程序输出什么
#include stdio.h
unsigned char i 0;
int main()
{
for(i 0;i255;i)
{
printf(hello world\n);
}
return 0;
}
答案
死循环
解释
unsigned char的范围就是0-255for循环的条件恒成立进入死循环 三、浮点型在内存中的存储
常见的浮点数 3.14159 1E10也就是1.0*10^10) 浮点数家族包括floatdoublelong double类型 浮点数表示的范围float.h中定义 1.一个例子
int main()
{
int n 9;
float *pFloat (float *)n;
printf(n的值为%d\n,n);
printf(*pFloat的值为%f\n,*pFloat);
*pFloat 9.0;
printf(num的值为%d\n,n);
printf(*pFloat的值为%f\n,*pFloat);
return 0;
}
结果 2.浮点数存储规则
任意一个二进制浮点数V可以表示成下面的形式 eg10进制的5.5转化为二进制 101.1小数点后面一位就是2的-1次方也就是0.5 二进制浮点数表示也就是-1^0*1.011*2^2(小数点提前两位也就是*2^2(二进制如果是十进制就是2^10) 得出S0M1.011E2 对于32位的浮点数最高的1位是符号位s接着的8位是指数E剩下的23位为有效数字M 对于64位的浮点数最高的1位是符号位S接着的11位是指数E剩下的52位为有效数字M 有效数字M的存储 对于有效数字M1M2,在计算机内部保存M的时候默认小数点前面一位为1所以保存只保存小数点后面的数字这样就节省了一位数的空间以32位为例虽然留给M只有23位但是相当于保存了24位有效数字 有效数字E的存储 首先E是一个为无符号数如果E为8位它的取值范围为0-255如果E为11位它的取值范围为0-2047。存入E的真实值时必须加上一个中间值对于8位的E这个中间值为127对于11的E这个中间值为1023 eg2^10的E为10所以保存32位浮点数时必须保存成10127137即10001001 指数E从内存中取出还可以再分成三种情况
1E不全为0或不全为1 指数E的计算值减去127或1023得到真实值再将M小数点前面的1补上 eg 0.5的二进制为0.1浮点数表示1.0*2^-1E存储为-1127126也就是01111110而尾数1.0去除1就是0那么0.5的二进制表示形式就是 0 01111110 00000000000000000000000 2E全为0 这时浮点数的指数E等于1-127或者1-1023即为真实值 M这时也不需要加上小数点前面的1而是还原成0.xxxx的小数这样做是为了表示正负0以及接近于0的很小的数 3E全为1 这时如果有效数字M全为0表示±无穷大正负取决于符号位s 现在再来解释一下前面的例子
从int类型的9来看 int n9 00000000 00000000 00000000 00001001int类型二进制 但是当它强制类型转化为float*时代表的含义就不一样了 0 00000000 00000000000000000001001 这时的E为全0那么E-126M也不用补0即M0.00000000000000000001001S0 那么*pFloat也就是-1^0*0.00000000000000000001001*2^(-126),这个数是极其小的打印出来就直接是0.000000float打印小数点后6位 从float类型的9.0来看当*pFloat9.0以后 9.01001.0 浮点型表示形式(-1)^0*1.001*2^3 二进制表示0 10000010 00100000000000000000 然后%d形式打印n的视角看这是补码符号位是0为正数原反补码相同转化为10进制也就是1091567616 本次内容就到此啦欢迎评论区或者私信交流觉得笔者写的还可以或者自己有些许收获的麻烦铁汁们动动小手给俺来个一键三连万分感谢 !