C语言整型在内存中的存储(练习)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: C语言整型在内存中的存储(练习)

1.

#include<stdio.h>
int main()
{
  char a = -1;
  signed char b = -1;
  unsigned char c = -1;
  printf("a=%d,b=%d,c=%d", a, b, c);  // a=-1,b=-1,c=255
  return 0;
}

//解析:


-1占4个字节,而char类型大小是1个字节,所以这时要发生截断

10000000000000000000000000000001  ----原码

11111111111111111111111111111110  ----反码

11111111111111111111111111111111  ----补码

截断后

a --->  11111111

同理

b --->  11111111

c --->  11111111

在内存中存储的是补码,各占8字节,但是打印的是用%d的形式打印的,所以要发生整型提升

char  <---->  signed char

a就是有符号的char,所以a的最高位就是符号位1,整型提升补1

a --->  11111111111111111111111111111111   提升后的补码,但打印的是原码。

        11111111111111111111111111111110   反码

        10000000000000000000000000000001   原码

a=-1,同理b=-1

c --->  11111111 是无符号的char类型,所以最高位1就不是符号位,整型提升补0

c --->  00000000000000000000000011111111   整型提升后补码,是正数,所以原码反码补码相同

将c转成10进制就是255  c=255


2.

#include<stdio.h>
int main()
{
  char a = -128;
  printf("%u\n", a); //4294967168
  return 0;
}

// 解析:


-128的二进制表示为:

10000000000000000000000010000000 --->原码

11111111111111111111111101111111 --->反码

11111111111111111111111110000000 --->补码

因为char类型,发生截断,最多存放1个字节,即:

a--->  10000000

因为打印%u的类型,无符号整型,发生整型提升,所以最高位1就是符号位,补1

a--->  11111111111111111111111110000000

正是因为是无符号打印,所以判定11111111111111111111111110000000就是个正数,原反补均相同

转换成10进制打印下就是4294967168


3.

#include<stdio.h>
int main()
{
  char a = 128;
  printf("%u\n", a);
  return 0;
}

//解析:

a的补码

01111111111111111111111110000000 --->a的补码

截断

10000000

整型提升

11111111111111111111111110000000

同上

4.

#include<stdio.h>
int main()
{
  int i = -20;
  unsigned int j = 10;
  printf("%d\n", i + j);  // -10
  return 0;
}

// 解析:


i=-20:

10000000000000000000000000010100   原码

11111111111111111111111111101011   反码

11111111111111111111111111101100   补码

j=10:

00000000000000000000000000001010   原码-反码-补码

i+j:

11111111111111111111111111110110   补码

11111111111111111111111111110101   反码

10000000000000000000000000001010   原码

转换成10进制:

i + j = -10


5.

#include<stdio.h>
#include<windows.h>
int main()
{
  unsigned int i;
  for (i = 9; i >= 0; i--)
  {
    printf("%u\n", i);     // 死循环
    Sleep(1000);
  }
  return 0;
}

// 解析


当i--到-1时,-1的二进制表示为:

10000000000000000000000000000001  原码

11111111111111111111111111111110  反码

11111111111111111111111111111111  补码

因为%u打印,所以11111111111111111111111111111111全是有效位,即位正数,输出的原码 等于反码

转成10进制,就是一个很大的数字,以此类推陷入死循环。


6.

#include<stdio.h>
int main()
{
  char a[1000];
  int i;
  for (i = 0; i < 1000; i++)
  {
    a[i] = -1 - i;
  }
  printf("%d", strlen(a));  // 255
  return 0;
}

理解这道题需要清楚一个char类型到底能放什么数值

image.png类似的,short也有类似的性质:image.png 

同理int等等

7.

#include<stdio.h>
unsigned char i = 0;
int main()
{
  for (i = 1; i <= 255; i++)
  {
    printf("hello world\n");  //死循环打印hello world
  }
  return 0;
}

// 解析


这道题目的做法跟上一道题目类似,都涉及到了char类型到底能放什么数值,由上题可知,unsigned char类型取值范围是在0~255,当i++到255时,其二进制表示1字节为11111111,当i在加1的时候,11111111+1得到100000000,取8bit,再转换成10进制就是0,以此类推1,2,3,4,等等依次循环,所以会死循环打印hello world  


相关文章
|
8天前
|
存储 编译器 C语言
C语言存储类详解
在 C 语言中,存储类定义了变量的生命周期、作用域和可见性。主要包括:`auto`(默认存储类,块级作用域),`register`(建议存储在寄存器中,作用域同 `auto`,不可取地址),`static`(生命周期贯穿整个程序,局部静态变量在函数间保持值,全局静态变量限于本文件),`extern`(声明变量在其他文件中定义,允许跨文件访问)。此外,`typedef` 用于定义新数据类型名称,提升代码可读性。 示例代码展示了不同存储类变量的使用方式,通过两次调用 `function()` 函数,观察静态变量 `b` 的变化。合理选择存储类可以优化程序性能和内存使用。
133 82
|
8天前
|
存储 C语言
【C语言基础考研向】04整型进制转换
本文介绍了计算机中整型常量的不同进制表示,包括二进制、八进制、十六进制和十进制,并解释了它们之间的转换方法。以一个32位整型数为例,展示了其在不同进制下的表示形式及计算方法,特别指出在内存观察中常用十六进制,同时提到了小端存储方式对数据的影响。
|
9天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
11天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
11天前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
11天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
16天前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
1月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
|
2月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
189 14
|
22天前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储

热门文章

最新文章