【C语言】整型在内存中的存储

简介: 【C语言】整型在内存中的存储

一、为什么内存中存储补码

上一节我们了解了原码,反码,补码的概念(http://t.csdn.cn/N0grg),也知道了对于整型来说,数据存放内存中存的是补码,可是为什么存储补码而不存储宜于理解的原码呢,这是因为计算机只有加法器,如果只运算加法,那么利用原码计算没有任何问题,比如5+2=7

那么减法呢,如果计算机是人脑,那么它可能会这样计算10-2=8

但是注意,计算机可不会像人脑一样认识减法,实际的情况是CPU只有加法器,也就是他只能计算加法,却计算不了减法,那么怎么办呢,于是就有了补码的诞生,比如我们要计算1-1,这是计算机会把1-1识别为1+(-1),并且以补码的方式计算,如图

并且原码与补码的相互转换,运算过程是相同的,上节 (http://t.csdn.cn/N0grg)我们知道了原码转换为补码的方法,那么由补码转换为原码很明显就是原码转化为补码的逆过程,但是实际上他们可以是相同的运算过程,如图:


二、大小端概念

我们不难发现调试的内存监视窗口中,数据似乎是倒着存储的,如图:

对于变量a,这里的值应为0x00000014(0x表示十六进制),可是内存中却倒着显示,这是因为在计算机系统中,存在着两种存储模式。

大端(存储)模式:指数据的低位保存在内存的高地址中,数据的高位,保存在内存的低地址中。

小端(存储)模式:指数据的低位保存在内存的低地址中,数据的高位,保存在内存的高地址中。

注意:大小端字节序由机器本身决定,与编译器无关。


百度笔试试题:

请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。

#include<stdio.h>
int check_sys()
{
  int i = 1;
  return (*(char*)&i);
}
int main()
{
  int ret = check_sys();
  if (ret == 1)
    printf("小端\n");
  else
    printf("大端\n");
  return 0;
}

几道小题:

(1)下面代码的结果是:255

int main()
{
  char a[1000] = {0};
  int i=0;
  for(i=0; i<1000; i++)
  {
    a[i] = -1-i;
  }
  printf("%d",strlen(a));
  return 0;
}

可以利用头文件limits.h查询char可以存储多大的数据,输入CHAR_MAX鼠标右击转到定义:

即char类型存储数据大小范围是-128到127,对于此题,a[0]=-1,依此类推负数最多到-128,而-128再-1,由于char类型负数最多到-128,所以此时a[i]的值会变为127,再到0,而strlen函数识别到\0,\0的ASCII码值为0,所以结果为128+127=255,打印的结果为255。


在32位大端模式处理器上变量b等于( )

unsigned int a= 0x1234;
unsigned char b=*(unsigned char *)&a;

大端序中,低地址到高地址的四字节十六进制排列分别为00 00 12 34,其中第一个字节的内容为00。

目录
相关文章
|
20天前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
32 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
20天前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
49 6
|
24天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
41 6
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
105 13
|
24天前
|
大数据 C语言
C 语言动态内存分配 —— 灵活掌控内存资源
C语言动态内存分配使程序在运行时灵活管理内存资源,通过malloc、calloc、realloc和free等函数实现内存的申请与释放,提高内存使用效率,适应不同应用场景需求。
|
24天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
22天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
54 1
|
28天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
28天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
219 1
|
17天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。