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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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  


相关文章
|
1月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
51 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
68 6
|
2月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
57 6
|
2月前
|
大数据 C语言
C 语言动态内存分配 —— 灵活掌控内存资源
C语言动态内存分配使程序在运行时灵活管理内存资源,通过malloc、calloc、realloc和free等函数实现内存的申请与释放,提高内存使用效率,适应不同应用场景需求。
|
2月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
71 1
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
421 1
|
1月前
|
存储 监控 算法
深入探索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)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
27 3