详解C语言中数据的存储

目录
  • 一、类型归类
    • 1、整形家族
    • 2、浮点型家族
    • 3、指针类型
    • 4、空类型
  • 二、类型的意义
  • 三、数据在类型中存储(以整形和浮点型为例子)
    • 1. 关于 存储的基本概念
    • 2.存储模式
  • 四.应用
    • 1.
    • 2.
  • 对于char范围的讨论
  • 总结

一、类型归类

对于基本的c语言数据类型的基本归类

1、整形家族

char (内存存储的为ascall码值,存储为整数)
  unsigned char//   unsigned为无符号关键字
     signe char//
short
   unsigned short (int)// (int )表示int可以省略不写
     signed short  (int)
int
    unsigned int
     signed int
long
    unsigned  long (int)
     signed long   (int)

2、浮点型家族

float
double

3、指针类型

int* ptr;
char* pa;
float* pf;
void* pv;

4、空类型

void 表示空类型(无类型)

通常应用于函数的返回类型,返回参数,指针类型

二、类型的意义

1.占据的内存大小

2.作为数据时所操作的大小(即为数据看待类型的视角)

三、数据在类型中存储(以整形和浮点型为例子)

1. 关于 存储的基本概念

计算机的(整形)有符号数,有三种表示方法,原码,反码,补码

三种表示方法 均存在 符号位 和 数值位 两部分,符号位的‘0'表正,‘1'表示负,数值位表示方法有差异(对于无符号数:原,反,补表示相同)

原码:直接将数字按照正负,用二进制方法翻译表示;

反码:将原码的符号位不变,其他位按位取反;

补码:反码+1;

对于正数而言,原,反,补相同:

int a=20;
// 00000000 00000000 00000000 00010100 原码
// 00000000 00000000 00000000 00010100 反码
// 00000000 00000000 00000000 00010100 补码

对于负数而言

int a=-1;
// 10000000 00000000 00000000 00001010 原码
// 11111111 11111111 11111111 11110101 反码
// 11111111 11111111 11111111 11110110 补码

对于整形数据而言再内存存储的是补码

2.存储模式

1.大端模式(大端字节序模式):较高的有效字节存储在较低的存储器地址,较低的有效字节存储在较高的存储器地址。

2.小端模式(小端字节序模式):较低的有效字节存储在较低的存储器地址,较高的有效字节存储在较高的存储器地址。

地址的视图

低-------------------------------->--------高

关于设计判断当前机器的字节序

int check_sys(void)
{
    int a=1;
    char* p=(char*)&a;//访问第一个字节序看是     01.....0  还是 0...01
    return *p;
}
int main()
{
    int ret=check_sys();
    if(ret==1)
        printf("小端");
    else
        printf("大端");
}

在这里强制转化成(char*)利用他只访问一个字节的视角进行观测

指针类型的意义

1.指针类型决定了指针类型解引用操作符能访问几个字节

2.指针+类型决定了指针+1跳过几个字节

四.应用

应用前应掌握的基本概念 整形提升

1.

char a=-1;
//  -1作为整形数在内存中以补码形式存储
// 10000000 00000000 00000000 0000001-原码
// 11111111 11111111 11111111 1111110 - 反码
// 11111111 11111111 11111111 1111111 -补码
// 当被赋予a时 a为char型只能存储8个字节 就要发生 截断
// 即 a 存储为 1111111
signed char b=-1;
// sigend为默认关键字 声明和声明都默认为有符号
// 同理 b 1111111
unsigned char c=-1;
// c 1111111将高位当做数值位对待
printf("%d %d %d ",a,b,c);
//       -1  -1  255
// 当要打印为%d 应当发生整形提升
//  负数为有符号型 整形提升高位补1;
// 无符号型提升高位补0,将原高位看作数值位
//  将 计算过程的  补码   转换为原码后即为所求结果

2.

char a=-128;
printf("%u\n",a);

char a=-128;
//10000000 00000000 00000000 10000000
//11111111 11111111 11111111 01111111
//11111111 11111111 11111111 10000000
// 截断10000000
// char a 有符号 按符号位提升
//整形提升  11111111 11111111 11111111 10000000
作为 无符号数 原反补相同
//11111111 11111111 11111111 10000000-转换为对应的十进制数

对于char范围的讨论

有符号的(以下均为补码)

有符号char范围 -128 --127

例题

char a[1000];
int i;
for(i=0;i<1000;i++)
{
a[i]=-1-i;
}
printf("%d",strlen(a));

对于 a[i]的计算结果 从 -1......-128..127....1 0

所以所得结果为 128+127=255

无符号(同补码)

最高位视为数值位则 范围为 0 ---255

例题

unsigned char i=0;
for(i=0;i<255;i++)
{
   printf(" hello\n");
}

思路同上

程序陷入死循环

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 关于C语言中数据在内存中的存储详解

    前言 1. 数据类型详细介绍 2. 整形在内存中的存储:原码.反码.补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 一.数据类型介绍 1.类型的基本归类 1.整形家族 char unsigned char signed char short unsigned short [int] signed short [int] int unsigned int signed int long unsigned long [int] signed long [int] 2.浮点型家族

  • C语言编程数据在内存中的存储详解

    目录 变量在计算机中有三种表示方式,原码反码,补码 原码 反码 补码 总结一下 浮点数在内存的储存 C语言中,有几种基本内置类型. int unsigned int signed int char unsigned char signed char long unsigned long signed long float double 在内存中创建变量,会在内存中开辟空间,并为其赋值. int a=10; 在计算机中,所有数据都是以二进制的形式存储在内存中. 变量在计算机中有三种表示方式,原码反

  • C语言数据在内存中的存储详解

    目录 文章摘要 一.C语言的数据类型 数据类型基本分为: 二.隐式类型转换 1.什么是隐式类型转换 2.整型提升 3.类型转换 三.机器大小端 1.什么是大小端 2.大小端在截断的应用 3.判断当前机器的字节序是大端还是小端 四.整型在内存中的存储 1.原码.反码.补码 2.举例实践整型数据在内存的存储 总结 文章摘要 本文通过内存底层原理,帮你透彻了解数据存储进内存与从内存中读取的区别以及不同数据类型下数据计算.赋值的变化情况 要透彻理解这些,必须知道隐式类型转换以及机器大小端的概念,本文会对

  • 带你了解C语言的数据的存储

    目录 C语言当中使用的数据类型 使用的类型 整型类 浮点类型 内存当中的存储 原码.反码.补码 大小端 什么是大小端 浮点数的存储 浮点数的存储 浮点数的存储规则 指数 E 从内存当中取出 总结 C语言当中使用的数据类型 使用的类型 char 字符数据类型 short 短整型 int 整形 long 长整型 long long 更长的整形 float 单精度浮点数 double 双精度浮点数 这些里面又分为整型和浮点型 整型类 整型又分为有符号整型和无符号整型,[int] 可以省略掉,就像 sh

  • C语言数据存储详解

    目录 一.数据类型 二.整型在内存中的存储 1.原码.反码.补码 大小端介绍 三.浮点型在内存中的存储 1.举一个浮点数存储的例子: 2.浮点数存储规则: 总结 一.数据类型 char:字符数字类型.有无符号取决于编译器,大部分编译器有符号(signed char) 而short.int.long都是有符号的. unsigned char c1=255;内存中存放二进制的补码:11111111 都是有效位,没有符号位 char c2=255;结果为-1 同理可推出short.int等 二.整型在

  • 详解C语言中数据的存储

    目录 一.类型归类 1.整形家族 2.浮点型家族 3.指针类型 4.空类型 二.类型的意义 三.数据在类型中存储(以整形和浮点型为例子) 1. 关于 存储的基本概念 2.存储模式 四.应用 1. 2. 对于char范围的讨论 总结 一.类型归类 对于基本的c语言数据类型的基本归类 1.整形家族 char (内存存储的为ascall码值,存储为整数) unsigned char// unsigned为无符号关键字 signe char// short unsigned short (int)//

  • 详解C语言中不同类型的数据转换规则

    不同类型数据间的混合运算与类型转换 1.自动类型转换 在C语言中,自动类型转换遵循以下规则: ①若参与运算量的类型不同,则先转换成同一类型,然后进行运算 ②转换按数据长度增加的方向进行,以保证精度不降低.如int型和long型运算时,先把int量转成long型后再进行运算 a.若两种类型的字节数不同,转换成字节数高的类型 b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型 ③所有的浮点运算都是以双精度进行的,即使是两个float单精度量运算的表达式,也要先转换成double

  • 详解R语言中的表达式、数学公式、特殊符号

      在R语言的绘图函数中,如果文本参数是合法的R语言表达式,那么这个表达式就被用Tex类似的规则进行文本格式化. y <- function(x) (exp(-(x^2)/2))/sqrt(2*pi) plot(y, -5, 5, main = expression(f(x) == frac(1,sqrt(2*pi))*e^(-frac(x^2,2))), lwd = 3, col = "blue") library(ggplot2) x <- seq(0, 2*pi, b

  • 详解C语言中双向循环链表的实现

    目录 实现细节 辅助理解图 具体实现代码 1.对链表进行初始化 2.任意位置前的插入 3.任意位置的删除 4.头插和尾删 完整代码 头文件 具体函数 测试 实现细节 1.带一个哨兵位(哨兵节点,初始节点,不存储有效数据,用来方便后期数据的存储与查找) 2.与单向链表不同的是,双向链表中每个数据节点包含两个指针,分别指向前后两个节点 3.双向链表是循环的,其尾节点后不是空指针,而是与头部的哨兵节点通过指针相连 辅助理解图 具体实现代码 1.对链表进行初始化 初始化:哨兵位的前后指针均指向哨兵节点本

  • 一文详解C语言中文件相关函数的使用

    目录 一.文件和流 1.程序文件 2.数据文件 3.流 二.文件组成 三.文件的打开和关闭 1.文件的打开fopen 2.文件关闭fclose 四.文件的顺序读写 1.使用fputc和fgetc写入/读取单个字符 2.使用fputs和fgets写入/读取一串字符 3.使用fprintf和fscanf按照指定的格式写入/读取 4.使用fwrite和fread按照二进制的方式写入/读取 5.使用sprintf和sscanf将格式化数据和字符串互相转换(文件无关) 五.文件的随机读写 1.fseek(

  • 详解Go语言中切片的长度与容量的区别

    目录 切片的声明 切片的长度和容量 切片追加元素后长度和容量的变化 append 函数 切片的源代码学习 切片的结构体 切片的扩容 总结 切片的声明 切片可以看成是数组的引用(实际上切片的底层数据结构确实是数组).在 Go 中,每个数组的大小是固定的,不能随意改变大小,切片可以为数组提供动态增长和缩小的需求,但其本身并不存储任何数据. // 数组的声明 var a [5]int //只指定长度,元素初始化为默认值0 var a [5]int{1,2,3,4,5} // 切片的声明 // 方法1:

  • 详解R语言中生存分析模型与时间依赖性ROC曲线可视化

    R语言简介 R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. 人们通常使用接收者操作特征曲线(ROC)进行二元结果逻辑回归.但是,流行病学研究中感兴趣的结果通常是事件发生时间.使用随时间变化的时间依赖性ROC可以更全面地描述这种情况下的预测模型. 时间依赖性ROC定义 令 Mi为用于死亡率预测的基线(时间0)标量标记. 当随时间推移观察到结果时,其预测性能取决于评估时间 t.直观地说,在零时间测量的标记值应该

  • 详解R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型

    在标准线性模型中,我们假设 .当线性假设无法满足时,可以考虑使用其他方法. 多项式回归 扩展可能是假设某些多项式函数, 同样,在标准线性模型方法(使用GLM的条件正态分布)中,参数  可以使用最小二乘法获得,其中  在  . 即使此多项式模型不是真正的多项式模型,也可能仍然是一个很好的近似值 .实际上,根据 Stone-Weierstrass定理,如果  在某个区间上是连续的,则有一个统一的近似值  ,通过多项式函数. 仅作说明,请考虑以下数据集 db = data.frame(x=xr,y=y

  • 详解Go语言中的数据类型及类型转换

    目录 1.基本数据类型 2.基础数据类型转换 3.基本数据类型转为字符串 4.strconv的使用 5.字符串转为基础类型 1.基本数据类型 数据类型有很多,先研究一下基础的,例如:布尔型.数字类型.字符串类型. 数字类型有uint8.uint16.uint32.uint64.int8.int16.int32.int64(uint和int区别在于uint为无符号整数,即只支持正数,不支持负数形式) 数字浮点型有fload32.float64.complex64.complex126(后面两个均为

  • 详解C语言中二级指针与链表的应用

    目录 前言 二级指针讲解 链表的应用 定义双链表的结构体 创建双链表 前言 这篇文章即将解决你看不懂或者不会写链表的基本操作的问题,对于初学者而言,有很多地方肯定是费解的.比如函数的参数列表的多样化,动态分配内存空间函数malloc等,其实这些知识和指针联系紧密,尤其是二级指针.那么开始好好的学习这篇文章吧! 二级指针讲解 简述:其实就是一个指针指向另一个指针的地址. 我们都知道指针指向地址,但是指针自身也是一个变量,当然也可以被二级指针所指向. 语法:形如 int x = 10; int *q

随机推荐