学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

相关文章
|
4天前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
26 10
|
23小时前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
23 14
|
5天前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
15 0
|
5天前
|
存储 安全 Java
Java面试题:如何在Java应用中实现有效的内存优化?在多线程环境下,如何确保数据的线程安全?如何设计并实现一个基于ExecutorService的任务处理流程?
Java面试题:如何在Java应用中实现有效的内存优化?在多线程环境下,如何确保数据的线程安全?如何设计并实现一个基于ExecutorService的任务处理流程?
10 0
|
5天前
|
安全 Java 调度
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
7 0
|
5天前
|
安全 算法 编译器
C++一分钟之-内存模型与数据竞争
【7月更文挑战第10天】了解C++11内存模型对多线程编程至关重要。它定义了线程间同步规则,包括顺序一致性、原子操作和内存屏障。数据竞争可能导致不确定行为,如脏读和丢失更新。可通过互斥量、原子操作和无锁编程避免竞争。示例展示了`std::mutex`和`std::atomic`的使用。掌握内存模型规则,有效防止数据竞争,确保多线程安全和性能。
11 0
|
29天前
|
消息中间件 存储 Kafka
实时计算 Flink版产品使用问题之 从Kafka读取数据,并与两个仅在任务启动时读取一次的维度表进行内连接(inner join)时,如果没有匹配到的数据会被直接丢弃还是会被存储在内存中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
21天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
24 2
|
24天前
|
存储
数据在内存中的存储(2)
数据在内存中的存储(2)
27 5
|
24天前
|
存储 小程序 编译器
数据在内存中的存储(1)
数据在内存中的存储(1)
31 5