C语言进阶数据的存储
Posted Huang_ZhenSheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶数据的存储相关的知识,希望对你有一定的参考价值。
目录
1.整形在内存中的存储
原码 反码 补码
数据在内存中以2进制的形式存储
对于整数来说:整数二进制有3种表示形式:原码,反码,补码
对于正整数:原码,反码,补码相同
负整数:原码,反码,补码
- 按照数据的数值写出的二进制序列就是原码
- 原码的符号位不变,其他位按位取反,得到的就是反码
- 反码+1,得到的就是补码
整数在内存中存储的是补码
大小端介绍:
大端字节序:把数据的低位字节序的内容放在高地址处,高位字节序的内容放在低地址处
小端字节序:把数据的低位字节序的内容放在低地址处,高位字节序的内容放在高地址处
例题:设计一个小程序来判断当前机器的字节序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int check()
{
int a = 1;
char* p = (char*)&a;//(char*)会强行截取内存低地址处的第一位数字
return *p;//返回1表示小端,返回0表示大端
}
int main()
{
int ret = check();
if (ret == 1)
printf("小端\\n");
else
printf("大端\\n");
return 0;
}
代码分析1:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char a = -1;//整数存到内存中发生截断,存8个比特位
//10000000 00000000 00000000 00000001
//11111111 11111111 11111111 11111110
//11111111 11111111 11111111 11111111
//11111111补码
//11111111 11111111 11111111 11111111补码
//打印的时候以%d的形式打印,打印整形,按照符号位提升
signed char b = -1;
//11111111
//打印的时候以%d的形式打印,打印整形,按照符号位提升
unsigned char c = -1;
//11111111
//打印的时候以%d的形式打印,打印整形
//00000000 00000000 00000000 11111111(高位补0)补码,正数(原反补相同)
printf("a = %d,b = %d,c = %d",a,b,c);//-1,-1,255
return 0;
}
补充:
1.char 到底是signed char 还是unsigned char?C语言标准并没有规定,取决于编译器
2.而int 类型,short类型代表的都是有符号的
代码分析2:
下面程序输出的结果是:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char a = -128;
//10000000 00000000 00000000 10000000
//11111111 11111111 11111111 01111111
//11111111 11111111 11111111 10000000
//10000000
//11111111 11111111 11111111 10000000
printf("%u\\n",a);//%u的形式打印
//11111111 11111111 11111111 01111111
//10000000 00000000 00000000 10000000
printf("%d\\n",a);
return 0;
}
代码分析3:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char a = 128;
//00000000 00000000 00000000 10000000 原反补相同
//10000000
//11111111 11111111 11111111 10000000
printf("%u\\n",a);
return 0;
}
char a里面能放得下128这么大的数吗?下面来讨论一下char类型变量的取值范围
有符号的char类型的取值范围是:-127~128
无符号的char类型的取值范围是:0 ~ 255
代码分析4:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = -20;
//10000000 00000000 00000000 00010100
//11111111 11111111 11111111 11101011
//11111111 11111111 11111111 11101100
unsigned int j = 10;
if (i + j > 0)
{
printf("大于0\\n");
}
//00000000 00000000 00000000 00001010
printf("%d\\n",i+j);
//11111111 11111111 11111111 11101100
//00000000 00000000 00000000 00001010
//相加:
//11111111 11111111 11111111 11110110 补码
//11111111 11111111 11111111 11110101
//10000000 00000000 00000000 00001010-->-10
return 0;
}
i+j大于0因为有符号整型和无符号整型相加放入内存时,有符号整型会强制转化成无符号整型
代码分析5:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i++)
{
printf("%u\\n",i);
}
return 0;
}
i 作为无符号数怎么变都是大于0,--->死循环
代码分析6:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d",strlen(a));//找'\\0'
return 0;
}
输出得---> 255
代码分析7:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
unsigned char i = 0;//取值范围0-255
int main()
{
for (i = 0; i <= 255; i++)
{
printf("HelloWorld\\n");
}
return 0;
}
输出得--->死循环
2.浮点型在内存中的存储
float,double,long double类型
浮点数"5.5"在计算机内部是如何存储的?
浮点数:5.5 ——10进制
二进制:101.1 ——>1.011*2^2 ——>(-1)^0*1.011*2^2 S = 0; M = 1.011; E = 2
代码分析:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n = 9;
//00000000 00000000 000000000 00001001
float* pFloat = (float*)&n;
printf("n的值为:%d\\n",n);
printf("*pFloat的值为:%f\\n",*pFloat);
//浮点数的形式
//0 00000000 0000000 000000000 00001001
//S E M
//M:0.0000000 000000000 00001001*2^(-126)
*pFloat = 9.0;
//1001.0
//1.001*2^3
//E = 3+127 = 130;
//0 10000010 00100000000000000000000
printf("num的值为:%d\\n",n);
printf("pFloat的值为:%f\\n",*pFloat);
return 0;
}
以上是关于C语言进阶数据的存储的主要内容,如果未能解决你的问题,请参考以下文章
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段