首页 > 其他分享 >C语言——数据的存储(总结)

C语言——数据的存储(总结)

时间:2022-10-03 14:32:01浏览次数:55  
标签:总结 存储 0000 符号 int 补码 C语言 char 内存

一.数据类型

        基本类型

        打印类型

所占大小(字节)

char         字符型

       %c

    1

short        短整型

       %d  

    2

int           整形

       %d         

    4

long        长整形

       %ld  

    4

long long 更长整形 

       %lld        

    8

float      单精度浮点型

        %f             

    4

double 双精度浮点型

       %lf   

    8

类型的意义:

  1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。
  2. 如何看待内存空间的视角。

简单归类:

整型家族
char
//(直接使用char类型,不确定它是unsigned还是signed,取决于编译器,一般为signed型)
//char存储的时候,存的是它的ASCII码值,也是个整数,故归于整形家族
unsigned char
signed char

short(signed short)
unsigned short [int]
signed short [int]

int(signed int)
unsigned int
signed int

long(signed long)
unsigned long [int]
signed long [int]
浮点型家族
float
double
构造类型-自定义类型
> 数组类型
> 结构体类型 struct
> 枚举类型 enum
> 联合类型 union
指针类型
int *pi;
char *pc;
float* pf;
void* pv;
空类型
void
void 表示空类型(无类型)
(通常应用于函数的返回类型、函数的参数、指针类型)

二.整形在内存中的存储

C语言——数据的存储(总结)_补码

(补码在内存中是倒序存储)

整数在内存中存储形式之前讲过,在此就不多说

图中的是十六进制形式,4个二进制位换一个十六进制位

a的补码的十六进制形式为FFFFFFF6

注意:对于整形:

   1.数据存放的是补码

   2。整形表达式计算是用补码计算的

   3.打印和显示出来是原码


例子:

#include<stdio.h>
int main()
{
char a = -1
//由于char是1个字节
//所以是11111111 存储到a中
signed char b = -1;
//11111111
unsigned char c = -1;
//11111111
printf("a=%d,b=%d,c=%d", a, b, c);//a=-1,b=-1,c=255
//打印的是%d,会整型提升
//整形提升看的是原符号位
//a由于是char所以按符号位来提升
//a:1111111111111111111111111111111 内存中补码
//以%d打印的时候看的是其原码,所以为10000000000000000000000000000001
//a与b类似
//有符号整型提升的时候会把符号位当作最高位
//a b:1000 0000 0000 0000 0000 0000 0000 0001 -1的原码
//c:无符号整型提升后面补0
//c:00000000000000000000000011111111-->无符号c的补码
//c:00000000000000000000000011111111-->无符号c的原码
return 0;
}

1.*****

//%u是打印无符号整型,认为内存中存放的补码对应的是一个无符号数

//%d是打印有符号整型,认为内存中存放的补码对应的是一个有符号数

#include <stdio.h>
int main()
{
char a = -128;
//a的补码 :1111 1111 1111 1111 1111 1111 1000 0000
//截断后为:1000 0000
//由于是%u打印,发生整形提升,又为有符号char,高位补1
//提升后内存中放的是补码,且是无符号数补码,高位不是符号数,其补码,原码相同---> 1111 1111 1111 1111 1111 1111 1000 0000
printf("%u\n", a);//4294967168//当为%d是结果为-128
return 0;
}

2.char的取值范围

   a:有符号的char的取值范围:-128~127

C语言——数据的存储(总结)_整型_02

127为最大值,加1不会变成128,而回是-128

    b:无符号的char的取值范围:0~255

(无符号整形减为0时还能再减,但不会减成负数,而是到无符号最大数,像个循环。而无符号最大数加1变成0)

例子:

#include<stdio.h>
int main()
{
unsigned int i;//无符号说明i值都不为负数
for (i = 9; i >= 0; i--)//恒成立
{
printf("%u\n", i);//当为%d是会认为内存中储存的是一个有符号的数字
}
return 0;
}




三.大小端字节序介绍及判断

大端(存储)模式,是指数据的低位存放在内存的高地址中,而数据的高位存放在内存的低地址中;

小端(存储)模式,是指数据的低位存放在内存的低地址中,而数据的高位存放在内存的高地址中。

注意:存储中靠右的是低地址,靠左是高地址

在0x11223344中44是低地址

int main()
{
int a = 0x11223344;
return 0;
}
a: 11 22 33 44 将其存到内存中可分为两种:

1: 低 11 22 33 44 高 --->大端字节序
2: 低 44 33 22 11 高 --->小端字节序

例题:判断当前机器的字节序

//可以通过获取第一个字节来判断
#include<stdio.h>
int main()
{
int a = 1;
char* p = (char*)&a;
if (*p == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}

C语言——数据的存储(总结)_整型_03

//函数法
#include<stdio.h>
int check_sys()
{
int a = 1;
//0000 0000 0000 0000 0000 0000 0000 0001
//大端存储:0x 00 00 00 01 解引用->0
//小端存储:0x 01 00 00 00 解引用->1
return (*(char*)&a);
//&a取出a的地址,然后把这个int*类型的地址转化为char*,最后解引用
//为大端存储,返回0;小端存储,返回1

}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}




四.浮点型在内存中的存储

浮点数家族:float 、double 、long double类型


#include<stdio.h>
int main()
{
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);//9
printf("*pFloat的值为:%f\n", *pFloat);//0.000000
//当以*pFloat是以 浮点数 的视角考的,以%f打印

*pFloat = 9.0;
printf("num的值为:%d\n", n);//1091567616
//以浮点型放进去,以整数视角拿的

//说明浮点数和整数在内存中存储方式是有区别的

printf("*pFloat的值为:%f\n", *pFloat);//9.000000
return 0;
}

任意一个二进制浮点数V的存储形式规则:(-1)^S*M*2^E

(-1)^S表示符号位,当S=0时,V为整数,当S=1时,V为负数

M表示有效数字,1<=M<2

2^E表示指数位

C语言——数据的存储(总结)_整型_04



标签:总结,存储,0000,符号,int,补码,C语言,char,内存
From: https://blog.51cto.com/u_15722538/5730213

相关文章

  • gradle总结
    安装点击查看详情#下载到本地直接解压#配置环境变量GRADLE_HOMEGRADLE_USER_HOMEPATH#打开cmd:gradle-v修改maven下载源#在init.d文件夹创建init.gradle文件allprojec......
  • Clion + QT个人使用总结
    大部分教学和资料都是qmake的所以碰到一些问题cmake的资料还是比较少所以苯人小小总结一下......
  • K8S高可用存储配置说明
    随着公司的不断发展,对一些外围工具的使用也逐渐增多,其中包括磁盘数据的高可用,目前采用数据同步的方式是借助DRBD实现主从同步(nfs+drbd+keepalived)。DRBD是分布式复制块设备,......
  • C语言与汇编
    C变量C语言是如何把各种类型的变量转换成对应的汇编语言呢?高级语言更容易被工程师理解,而汇编语言这样的低级语言,则更容易被机器解读。这是因为汇编语言里的大部分内容都......
  • 英语16时态总结 转自JimBoom
    作者:​​DATA_MONK​​​......
  • 代码随想录day10 ● 459.重复的子字符串 ● 字符串总结 ● 双指针回顾
    459.重复的子字符串1classSolution{2public:3boolrepeatedSubstringPattern(strings){4stringt=s+s;5//掐头去尾6......
  • 10.2模拟赛总结
    模拟赛总结T1预计得分:100实际得分:30挂分原因:式子推错了没开longlongT2预计得分:80实际得分:80T3预计得分:50实际得分:10挂分原因:单调栈右半部分写错了T4......
  • C语言入门—明明的随机数
    题目描述明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的......
  • 题目集1~3的总结性Blog
    一、前言对于本次blog所涉及的题目,个人感觉主要是对于String类型的变量处理,以及对于面向过程所使用的类的用法有较高要求,难度也是逐渐递增,尤其是点线三角形更是如此,......
  • 第十四组chap1-2 学习总结
        在两周C语言的学习课程中,让我们从认识C语言到开始动手写代码,从最初对C语言的片面认知到重点学习,我们对C语言的认识越来越深。    学习总结:1.引言。这......