学C的第二十二天【深度剖析数据在内存中的存储:1. 数据类型介绍;2. 整型在内存中的存储】-3

简介: (5). 练习:(重点在注释) 1. 区别 unsigned 和 signed :

(5). 练习:(重点在注释)

           

1. 区别 unsigned 和 signed :

//练习:1.区别 unsigned 和 signed
#include <stdio.h>
int main() 
{
  char a = -1; //char 在 VS中 默认是 signed char
  //10000000000000000000000000000001 -- 原码
  //11111111111111111111111111111110 -- 反码
  //11111111111111111111111111111111 -- 补码
  //  -1是整数,存进char类型中会发生截断
  //        11111111  --    补码,截断获取最低8位
  // 最高位 是 符号位
  signed char b = -1;
  //和 char a 相同
  unsigned char c = -1;
  //        11111111  --    补码,截断获取最低8位
  // 最高位 是 数值位
  printf("a=%d,b=%d,c=%d", a, b, c);
  //%d - 十进制形式打印有符号整型数据,
  //这里会发生 整型提升
  //  11111111  --    补码,截断获取最低8位
  // 
  //  整型提升,有符号位按符号位补满,补满后:
  //11111111111111111111111111111111 -- 整型提升后补码
  //11111111111111111111111111111110 -- 反码
  //10000000000000000000000000000001 -- 原码
  //  
  //  整型提升,无符号位高位补0,补满后:
  //00000000000000000000000011111111 -- 整型提升后补码
  //    整数原码、反码、补码相同
  return 0;
}

c147b4a315334189aa34e75f4dbcd945.png

           

2. 使用 %u 打印 有符号整型:

           

(补充:%u -- 十进制形式打印无符号整型

             

(1). 打印 -128

//练习:2.使用 %u 打印 有符号整型:
#include <stdio.h>
int main() 
{
  char a = -128;
  //10000000000000000000000010000000 -- 原码
  //11111111111111111111111101111111 -- 反码
  //11111111111111111111111110000000 -- 补码
  //        截断后:
  //      10000000  -- 截断后补码
  printf("%u\n", a);
  // %u -- 十进制形式打印无符号的整型
  // 对 char 变量 打印 整型数字,进行整型提升
  // char类型 有符号位,按符号位补满:
  //11111111111111111111111110000000 -- 补满后的补码
  //因为是以 无符号整数 打印,所以 原码、反码、补码 相同
  // 那么这个数就很大了
  return 0;
}


c85b56089f264acaafd6058be687ccd9.png

                     

(2). 打印 128

//练习:3.使用 %u 打印 有符号整型:
#include <stdio.h>
int main()
{
  // -128 改成 128
  char a = 128;
  //00000000000000000000000010000000 -- 原码
  //11111111111111111111111101111111 -- 反码
  //11111111111111111111111110000000 -- 补码
  //        截断后:
  //      10000000  -- 截断后补码
  //  跟-128是一样的,
  //只是原码的符号位不一样,但截断后都是10000000
  printf("%u\n", a);
  // %u -- 十进制形式打印无符号的整型
  // 对 char 变量 打印 整型数字,进行整型提升
  // char类型 有符号位,按符号位补满:
  //11111111111111111111111110000000 -- 补满后的补码
  //因为是以 无符号整数 打印,所以 原码、反码、补码 相同
  // 那么这个数就很大了
  return 0;
}

373fc35284fe4248b2a10a9faefd0505.png

             

3. 用%d打印:有符号整型 + 无符号整型

//练习:3. 用%d打印:有符号整型 + 无符号整型
#include <stdio.h>
int main() 
{
  //有符号整型:
  int i = -20;
  //10000000000000000000000000010100 -- 原码
  //11111111111111111111111111101011 -- 反码
  //11111111111111111111111111101100 -- 补码
  //无符号整型:
  unsigned int j = 10;
  //00000000000000000000000000001010 -- 原码
  //      原码、反码、补码 相同
  printf("%d\n", i + j);
  // i的补码 和 j的补码 相加
  //11111111111111111111111111101100 -- i的补码
  //        +
  //00000000000000000000000000001010 -- j的补码
  //        =
  //11111111111111111111111111110110 -- 两补码相加后的补码
  //该补码再通过%d打印有符号数,最高位是符号位,知道补码,要计算得到原码
  //11111111111111111111111111110101 -- 反码
  //    反码 符号位 不变,其它位 按位取反
  //10000000000000000000000000001010 -- 原码 -》 -10
  return 0;
}

image.png

4. 使用无符号整数(无负数)进行自减循环

//使用无符号整数(无负数)进行自减循环
#include <stdio.h>
#include <windows.h>
int main() 
{
  unsigned int i;
  for (i = 9; i >= 0; i--)
  {
    printf("%u\n", i);
    Sleep(1000);
    //单位是毫秒,休眠1秒再继续下个语句
  }
  return 0;
}

image.png

5. 字符数组存储整型数字:

//字符数组存储整型数字:
#include <stdio.h>
#include <string.h>
int main() 
{
  char a[1000];
  //char类型数组,整型数字只能存储0~-128
  int i;
  for (i = 0; i < 1000; i++)
  {
    a[i] = -1 - i;//-1,-2......
  }
  //-1,-2,-3...-128,127,126,...3,2,1,0 -- 存一轮:256个元素
  //-1,-2,-3...-128,127,126,...3,2,1,0 -- 存一轮:256个元素
  //。。。。。
  printf("%d", strlen(a));
  //strlen 是求字符串长度的,
  //统计的是 \0 之前出现的字符的个数
  // \0 的ASCII码值是 0,找到0就停止计算
  return 0;
}

f4552bd1e9b144d6aed2f5cd0d105259.png

6. unsigned char 取值范围:

//unsigned char 取值范围:
#include <stdio.h>
unsigned char i = 0;//全局变量
//unsigned char 的整型取值范围是:0~255
int main() 
{
  // 255 再 +1 又变成 0
  for (i = 0; i <= 255; i++)
  {
    printf("hello world\n");
  }
  return 0;
}

bd63714fbf9c4d0f8febee98d619ab95.png

相关文章
|
22天前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
21天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
44 1
|
26天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
28天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
67 1
|
4月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
279 14
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
366 0
|
30天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
41 4
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
53 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储