IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 由浅入深带你剖析数据的在内存中的存储(1) -> 正文阅读

[C++知识库]由浅入深带你剖析数据的在内存中的存储(1)

目录

浅谈

构造类型:(自定义类型)

指针类型

空类型

整型在内存中的存储

为什么内存中一定用补码

大小端字节序存储

?2015百度面试题目

习题

习题1

习题2

习题3

?习题5

习题6


浅谈

c本身具有的类型:

整型:

char

short

int

long

long long

浮点型:

float

doubl

虽然 int 和 float都是4byte,但是视角不一样一个认为整型另一个认为浮点型。

int main()
{
signed short int a=0;
unsigned short b=0;
char c;//有符号?还是无符号?
//取决于编译器,大部分的编译器下char就是signed char,其他数据类型也是同样的道理
}

char--1byet--8bit 假设都是1

11111111---计算机存储放的都是补码

当我们认为是unsigned--11111111里的每一位都是有效位。

int main()
{
 unsigned char c1=255;
 printf("%d\n",c1);

 char c2=255;
 printf("%d\n",c2);

 return 0;
}

?

?c1,c2在内存中的值都是1,但是显示的结果不一样的原因就是有符号和无符号的区别

signed char c1其实能算出无符号字符型的范围

?unsigned char

构造类型:(自定义类型)

数组类型

结构体类型struct

枚举类型 enum

联合类型union

int main()
{
int a=10;
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(int));

int arr[10];
printf("%d\n",sizeof(arr));
printf("%d\n",sizeof(int [10]));
    //这里其实就可以看出数组也是有类型的只不过当数组元素个数不同气类型也会变化int arr[5]---in [5]
return 0;
}

指针类型

int *pi;

char*pc

float*pf

void*pv

空类型

void表示空类型(无类型)

通常应用于函数的返回类型,函数的参数,指针类型

int mian()
void test(void)//void test()
{
    printf("hehe\n");
}
{
    test();
    test(100);
    return 0;
}

整型在内存中的存储

int main()
{
int a=-1;
return 0;
}

这种现象其实就可以用原反补的概念来解释

正整数 原反补相同

负整数 原码就是带上符号位和时间显示的值

反码 符号位不变其余取反

补码在反码的基础上+1

a=-1

10000 0000 0000 0000 0000 0000 0000 0001-原码

1111 1111 1111 1111 1111 1111 1111 1110-反码

1111 1111 1111 1111 1111 1111 1111 1111-ff也就补码

这里ff就可以看出内存中存储的就是补码

为什么内存中一定用补码

cpu只会加法运算

?

?

大小端字节序存储

?

?2015百度面试题目

设计程序 判断大小端

//int main()
//{
//	int a = 1;
//	char* p = (char*)&a;
//	if (*p == 1)
//		printf("小端\n");
//	else
//		printf("大端\n");
//	return 0;
//}
//int check_sys()
//{
//	int a = 1;
//	char* p = (char*)&a;
//	return *p;
//}



int main()
{
	//大端返回0
	//小端返回1
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}
int check_sys()
{
	int a = 1;
	return* (char*)&a;
}
int main()
{
	//大端返回0
	//小端返回1
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

习题

习题1

int main()
{
	char a = -1;
	//1000 0000 0000 0000 0000 0000 0000 0001--原码
	//1111 1111 1111 1111 1111 1111 1111 1110--反码
	//1111 1111 1111 1111 1111 1111 1111 1111--补码
	//1111 1111 ---a//发生截断选取低八位---补码
	// 	   %d以有符号整数的形式进行打印 char--->int
	// 	   整型提升
    //1111 1111 1111 1111 1111 1111 1111 1111---a整型提升后的补码
	//1111 1111 1111 1111 1111 1111 1111 1110---a整型提升后的反码
	//1000 0000 0000 0000 0000 0000 0000 0001---a整型提升后的原码
	signed char b = -1;
	//1000 0000 0000 0000 0000 0000 0000 0001--原码
	//1111 1111 1111 1111 1111 1111 1111 1110--反码
	//1111 1111 1111 1111 1111 1111 1111 1111--补码
	//int---->char 发生阶段选取第八位
	//1111 1111 --截断后b的补码
	//%d---以有符号整数的形式打印char---->int要发生整型提升
	//1111 1111 1111 1111 1111 1111 1111 1111---->整型提升后的b的补码
	//1111 1111 1111 1111 1111 1111 1111 1110---->整型提升后b的反码
	//1000 0000 0000 0000 0000 0000 0000 0001---->整型提升后b的原码
	unsigned char c = -1;
	//1000 0000 0000 0000 0000 0000 0000 0001--原码
	//1111 1111 1111 1111 1111 1111 1111 1110--反码
	//1111 1111 1111 1111 1111 1111 1111 1111--补码
	//发生截断
	//1111 1111
	//整型提升
	//0000 0000 0000 0000 0000 0000 1111 1111
	printf("%d %d %d ",a,b,c);
	return 0;
}

习题2

int main()
{
	char a = -128;
	//10000 0000 0000 0000 0000 0000 1000 0000
	//10000 0000 0000 0000 0000 0000 0111 1111
	//11111 1111 1111 1111 1111 1111 1000 0000
    //截断
	//1000 0000
	//%u以无符号整型输出---->整型提升
	//0000 0000 0000 0000 0000 0000 1000 0000---补码
	//0000 0000 0000 0000 0000 0000 0111 1111---反码
	//1111 1111 1111 1111 1111 1111 1000 0000---原码超大的一个正数字
	printf("%u\n",a);
	return 0;
}

习题3

int main()
{
	int i = -20;
	//1000 0000 0000 0000 0000 0000 0001 0100  --->i原码
	//1111 1111 1111 1111 1111 1111 1110 1011  ---->i反码
	//1111 1111 1111 1111 1111 1111 1110 1100  ---->i码
	unsigned int j = 10;
	//0000 0000 0000 0000 0000 0000 0000 1010  ---->j原码反补都一样
	printf("%d\n",i+j);
	//i+j
	//1111 1111 1111 1111 1111 1111 1110 1100
	//0000 0000 0000 0000 0000 0000 0000 1010
	//1111 1111 1111 1111 1111 1111 1111 0110---->i+j的补码
	//1111 1111 1111 1111 1111 1111 1111 0101---->i+j的反码
	//1000 0000 0000 0000 0000 0000 0000 1010---->i+j的原码 -10
	return 0;
}

?习题4

#include<windows.h>
int main()
{
	unsigned int i = 0;
	//9 8 7 6 5 4 3 2 1 0 -1
	for (i = 9; i >= 0; i--)
	{
		printf("%u ",i);
		Sleep(1000);
	}
	return 0;
}

?习题5

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

习题6

unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("heheh\n");
	}
	return 0;
}

上述代码明显会死循环因为char i最大就是255当+1是往前进1变成1 0000 0000 因为截断的问题i又会变为0

A^A 睡觉去喽

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:48:45  更:2021-09-19 07:51:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:02:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码