【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。

猜你喜欢

转载自blog.csdn.net/2301_77112634/article/details/130909494