学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

相关文章
|
5月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1804 0
|
5月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
524 1
|
5月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
471 0
|
11月前
|
消息中间件 存储 缓存
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
396 12
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
1004 1
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
920 0
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
159 4

热门文章

最新文章