学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

相关文章
|
2月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
69 11
|
3月前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
3月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
140 1
|
3月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
339 1
|
28天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
25 3
|
2月前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
54 1
|
2月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。

热门文章

最新文章