首页 > 系统相关 >E33.【C语言】数据在内存中的存储练习集(未完)

E33.【C语言】数据在内存中的存储练习集(未完)

时间:2024-09-24 14:53:12浏览次数:12  
标签:11111111 1111 E33 int 打印 C语言 char 内存 128

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);
	return 0;
}

答案速查

分析

之前讲过,char在VS中默认为signed char,则a和b的打印结果应该是一样的

存储范围:

signed char -128~127

unsigned char 0~255

由于整数在内存中以补码形式存储,-1为0-1在计算器求出的结果为补码

这里如果没有位数的限制,由于不断向高位借位,会显示无数个1

在这里,无论是signed char类型还是unsigned char类型,其本质是限制在内存中的存储位数,从低位截断1 byte(8 bit),为1111 1111,因此a,b,c存储的均为1111 1111

回忆:15.75.【C语言】表达式求值

表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升

到了printf("a=%d,b=%d,c=%d", a, b, c);时,由于a,b,c均为字符类型,因此在打印(即使用)之前会被提升为普通整型

对于1111 1111

signed char:有符号-->最高位为符号位

最高位为1,按最高位提升,x86下为11111111 11111111 11111111 11111111

unsigned char:无符号-->最高位不是符号位,以0填充

x86下为00000000 00000000 00000000 11111111

%d 打印有符号整数,%u 打印无符号整数

补码转换为原码

11111111 11111111 11111111 11111111最高位为1是符号位,不参与运算

取反+1后10000000 00000000 00000000 00000001,打印结果为-1

00000000 00000000 00000000 11111111

最高位为0是符号位,为正数,正数的原码=反码=补码,打印结果为255

总结

类型的作用:1.申请内存空间时的大小 2.决定看待内存中数据的视角

2.

求下列代码的打印结果

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

答案速查

分析

-128==0-128

截断后8bit的补码10000000
char在VS中默认为signed char,整型提升11111111 11111111 11111111 10000000

%u打印,正数的原码=反码=补码

为FF FF FF 80-->

3.

把第2题的 char a = -128; 改为128,求打印的结果

结果和第二题一样

0-128截断后8bit的补码还是为10000000

4.

求下列代码的打印结果

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

答案速查

分析

char类型的范围 -128~127

看循环时,从a[0]开始依次存储-1,-2,-3,...,-128,-129,-130,...,-1000

strlen找到/0(ASCII码为00)则停止,返回值

显然从-129开始存储会发生问题,char最多只能容纳8bit,计算机对于他们的处理采用"环绕溢出"机制

15.75.【C语言】表达式求值文中有一张图,很好地解释了这个机制

对于有符号(signed char)类型

8bit补码截断后存储:

0:0000 0000

1:0000 0001

2:0000 0010

......

126:0111 1110

127:0111 1111//不可再进位,否则影响符号位

-1:1111 1111

-2:1111 1110

-127:1000 0001

-128:1000 0000//被规定为-128

-129:0111 1111-->其实是127的结果

相当于:-1,-2,-3,-4,..,-128,127,126,...,1,0一共255bytes

5.

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

思想和第4题相同, unsigned char i = 0;(i范围0~255)定义全局变量

for循环中i<=255是恒成立的,死循环打印

6.(HARD★)

已知x86环境下是小端序存储,求下列代码的打印结果

#include <stdio.h>
int main()
{
	int a[4] = { 1, 2, 3, 4 };
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x", ptr1[-1], *ptr2);
	return 0;
}

答案速查

分析

标签:11111111,1111,E33,int,打印,C语言,char,内存,128
From: https://blog.csdn.net/2401_85828611/article/details/142460791

相关文章

  • 第二节 基本数据类型与简单程序设计(零基础学C语言)
    1.C语言基本数据类型 有字符型char、短整型short、整型int或long、单精度浮点型float、双精度浮点型double 2.常量(1)符号常量:在程序运行过程中,其值保持不变的量为常量。常量可以用一个标识符(宏名)来表示,成为符号常量,可在程序开头用#define来定义,如#definePI3.1415926,其......
  • redisson内存泄漏问题排查
    问题描述最近生产有个服务突然出现频繁告警,接口P99响应时间变长,运维同学观察到相应的podcpu飙升,内存占用很高。cpu升高问题排查是老生常谈的话题了,一般可以使用top-ppid-H查看是哪个线程占用cpu高,再结合jstack找到对应的java线程代码。不过经验告诉我们,cpu升高还有另外一个......
  • C语言-“角谷猜想”是指:对任意自然数使用下面的方法计算得到一个新数;对这个新数继续使
     ......
  • C语言结构体、指针和常见数据结构
    在学习C语言时,结构体、指针和常见的数据结构如链表、栈、队列、二叉树等,是绕不开的重点。本篇博客用通俗易懂的方式,介绍这些概念,结合简单的代码示例,带你逐步掌握这些基础知识。1.结构体和指针我们先来看一眼结构体和指针,不懂这些的话,下面的代码肯定看不懂,没学过......
  • C语言分支语句和循环语句
     目录选择语句if-else语句if嵌套switch语句逻辑操作符!逻辑非&&逻辑与||  逻辑或循环语句while循环do-while循环for循环break和continue语句 break语句continue语句选择语句if-else语句if语句的语法形式if(表达式){语句}在C语言中非0为真,0为......
  • 数据结构-线性表的单链式存储结构图解及C语言实现
    概念链式存储:结点在存储器中的位置是任意的,即逻辑相邻的数据元素在物理上不一定相邻链式存储结构也称非顺序映像或链式映像图解链式存储结构中结点一般有两个部分组成,即数据域(data)和指针域,数据域是用于存放数据的,指针域是用来指向下一结点的地址的,其中头节点指向该链表......
  • 计算机二级C语言疑难
    1.strcpy函数在C语言中strcpy()函数会将字符串2(包括字符串结束字符/0)的函数覆盖到字符串1,如果字符串1没有足够的空间容纳字符串会导致缓冲溢出的错误例题:程序设计规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字符串最前面连续的*号不得多于n个;若多于n个,则删......
  • 动态内存管理
    1.为什么要有动态内存分配我们已经掌握的内存开辟方式有:intval=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节的连续空间但是上述的开辟空间的方式有两个特点:•空间开辟大小是固定的。•数组在申明的时候,必须指定数组的长......
  • 【C++】9.内存管理
    文章目录1.C/C++内存分布2.C语言中动态内存管理方式:malloc/calloc/realloc/free3.C++内存管理方式3.1new/delete操作内置类型3.2new和delete操作自定义类型4.operatornew与operatordelete函数(重点)4.1operatornew与operatordelete函数(重点)5.new和delete的实......
  • 20240923_212514 c语言 关系运算符
    ......