c++整数在内存中的存储方法是什么
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,今天小编给大家分享一下c++整数在内存中的存储方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们
千家信息网最后更新 2025年01月20日c++整数在内存中的存储方法是什么
今天小编给大家分享一下c++整数在内存中的存储方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
存放格式:
对整数来说,数据存放在内存中其实存放的是补码。原因是在计算机系统中,数值一律补码来表示和存储,原因在于,使用补码,可将符号位和数值域统一处理,同时,加法减法也可以统一处理(cpu只有加法器),此外,补码和原码相互转换,运算过程完全相同,不需要额外的硬件电路。
大小端介绍:
大段存储模式:指数据的低权值位存放于内存的高地址,高权值位存放于内存的低地址。
小段存储模式:指数据的高权值位存放于内存的高地址,低权值位存放于内存的低地址。
#define _CRT_SECURE_NO_WARNINGS 1#include#include int Judge1() //法一:利用地址int强转char判断。{ int i = 1; return *(char *)&i; //i共四个地址,取地址取最小的,再加个强转解引用后只取地址最小空间里的值。}int Judge2() //法二:利用unio联合体的特点:所有成员共享空间。联合体空间大小为成员所占空间的最大值,空间小的从低地址开始。{ union { int a; char i; }u1; u1.a = 1; return u1.i;}int main(){ int ret; ret = Judge2(); if (1 == ret) { printf("小端存储模式\n"); } else if (0 == ret) { printf("大端存储模式\n"); } system("pause"); return 0;}
在内存中进行加减过程
题一:
char a = -1; //原码 1000 0001 补码 1111 1111 signed char b = -1; //原码 1000 0001 补码 1111 1111 unsigned char c = -1; //原码 1000 0001 补码 1111 1111 //%d char转int型发生×××提升,有符号数发生×××提升前面补符号位,无符号数补0 printf("a=%d\n", a); //提升后 a=1111 1111 1111 1111 1111 1111 1111 1111 (补码) 输出原码:1000 0000 0000 0000 0000 0000 0000 0001 =-1 printf("b=%d\n", b); //同上 printf("c=%d\n", c); //提升后 c=0000 0000 0000 0000 0000 0000 1111 1111 (补码) 输出原码:0000 0000 0000 0000 0000 0000 1111 1111 =255
题二:
1>char a = -128; //原码 1 1000 0000 符号位溢出后截断 变为1000 0000 补码:1 1000 0000再次截断1000 0000 printf("%u\n", a); //×××提升:1111 1111 1111 1111 1111 1111 1000 0000 (补码) 因为是无符号×××输出,所以输出该二进制对应的十进制数。2>char a = 128; //原码:0 1000 0000 符号位溢出后截断 变为1000 0000 补码:1 1000 0000再次截断1000 0000 printf("%u\n", a); //由此可看出答案同上
题三:
unsigned char i = 0; //表示数值范围:0~255 for (i = 0; i <= 255; i++) //一直在0~255之间,当i=255再加1时,发生截断后就又变为0了 1111 1111+0000 0001=1 | 0000 0000 =0 { printf("%d\n", i); //所以一直循环,(死循环)重复打印0~255 if (i <= 250) { Sleep(30); } else{ Sleep(1000); } }
题四:
unsigned int i ; //表示数值范围:0~2^32-1 for (i = 9; i >=0; i--) //一直在0~2^32-1之间,当i=0再减1时,发生截断后就又变为0了 0000 0000 .... 0000 + 1111 ...1111=1111....1111 =1... 1111 因为是无符号数,所以为2^32-1 { printf("%d\n", i); //所以一直循环,(死循环)打印9、8、7...0 后从2^32-1开始减 if (i <= (pow(2,32)-10)) { sleep(10); } else{ sleep(1000); } }
题五:
char a[1000]; //-128~127 int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i; //-1、-2... 当执行到a[127]=-1-127=-128后,下一次执行 a[128]=-1-128=1111 1111+1000 0000=0111 1111(截断后)=127 //127再继续减减到0,该0之前元素个数即为strlen(a)的值=-1~-128+127~1=255 } printf("%d\n", strlen(a)); //'\0'=0;即求0之前多少个元素。(strlen不带\0)
以上就是"c++整数在内存中的存储方法是什么"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
补码
地址
内存
存储
符号
空间
模式
知识
篇文章
循环
输出
整数
数值
数据
方法
c++
最小
之间
元素
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
嵌入式软件开发有哪些职位
慧源通网络技术有限公司规章制度
vb 阿里云数据库
伟全网络技术有限公司怎么样
计算机网络安全实体
通州区技术软件开发介绍
常用网络安全协议的作用
表单时间写入数据库
地下城服务器变更什么意思
江苏德众互联网科技有限公司
克而瑞物管数据库价格
惠州网络安全产品
黑客攻击网站是攻击数据库
思科网络安全第二章答案
支持多软件开发的模型是哪个
额尔古纳租房软件开发
申报需要填表格哪些数据库
宁波直销软件开发项目管理
it 公司 买数据库
连接局域网服务器
连接数据库技术难点
搞软件开发累了怎么调节
电子期刊数据库英语
南阳永信网络技术
美国 网络安全法内容
青岛微风吹动网络技术有限公司
预防网络安全教育讲座
论坛网络安全毕业设计
浅谈数据库技术论文
武汉网络安全学院简介