练习题——整型数据在内存中的存储

时间:2023-02-01 17:02:27

一、

题目:

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

思路:

数据是存储在内存当中,假设将1存储到内存之中,小端存储和大端存储区别就在于第一个字节内容是1/0;而我们知道指针类型的作用有解引用操作时访问几个字节,char类型的指针就访问一个字节

指针类型的意义:

1、指针类型决定了指针解引用操作符能访问几个字节:char *p;*p 访问了一个字节,int *p; *p 就访问4个字节。

2、指针类型决定了指针+1,-1,加的或者减的是几个字节; char *p;p+1, 跳过一个字节,int *p;p+1;跳过一个整型4个字节

练习题——整型数据在内存中的存储

解答:

大端字节序:数据的低位存储在内存的高地址中,数据的高位存储在内存的低地址中。

小端字节序:数据的低位存储在内存的低地址中,数据的高位存储在内存的高地址中。

#include<stdio.h>

int check_sys()
{
int a = 1;
char* p = (char*)&a;//强制类型转换为char
return *p;
}

int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}

二、

题目:

以下代码输出结果是什么?

练习题——整型数据在内存中的存储

解析:

-1是整型,但要存储在char里面,所以肯定需要进行缩减,首先将-1的反码计算出来(因为在内存中存储的是补码形式),并且-1的补码全是1,需要牢记!缩减时根据最后结果需要的比特位数从低位开始选取。又因为输出结果是整型类型,所以又需要整型提升(有符号数按照符号位补全,无符号数直接补0),所以a,b都是有符号数,因此整型提升之后全是1,而输出结果使用的是原码,因此直接输出-1。而c无符号整型,整型提升后前缀是0,所以原码反码补码一致,按照整型提升后的结果直接翻译输出即可。

答案:

-1,-1,255

三、

题目:

练习题——整型数据在内存中的存储

解析:

本题前面思路与上一题一致,首先需要,缩减,然后根据数据类型进行整型提升。唯一区别在于本题输出结果是%u,因此是无符号整型,所以整型提升后的结果不需要再翻译成原码,因为无符号整型原码补码反码相同,直接补码即可

总结:

原先数据类型决定整型提升时需要补位的数字,而输出结果如果是无符号整型,直接打印补码,不需要像有符号数那样还需要输出时将反码翻译成补码!

四、char类型表示数据范围

练习题——整型数据在内存中的存储

有符号的char范围:-128~127

无符号的char的范围:0~255

TIP:

练习题——整型数据在内存中的存储


128是存储不到char类型,但我们可以看成127+1就是-128,因此两者输出结果一样!