首页 > 系统相关 >c语言中整数在内存中的存储

c语言中整数在内存中的存储

时间:2024-10-27 16:18:56浏览次数:7  
标签:存储 符号 int 补码 整数 char 内存 原码

整数的二进制表示有三种:原码,反码,补码

有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用‘0’表示“正,用1表示‘负’

最高位的以为被当作符号位,剩余的都是数值位。

整数的原码,反码,补码都相同

负整数的三种表示方法各不相同

     原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码

     反码:将原码的符号位不变,其他位一次按位取反就可以得到反码

     补码:反码+1就是补码

对于整形来说:数据存放内存中起始存放的就是二进制的补码

为什么呢?

在计算机系统中,数值一律用补码来表示和存储

原因在于,使用补码,可以将符号位和数值与统一处理

同时,加法和减法也可以统一处理(CPU只有加法器),此外补码和原码可以相互转换,其运算过程是相同的,不需要额外的硬件电路

例题:变量不同的定义,分别用整形进行打印

#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;
 }

 运行结果是:a=-1,b=-1,c=255

这是因为

//-1是一个负数 
 //原码:10000000000000000000000000000001
 //反码:11111111111111111111111111111110
 //补码:11111111111111111111111111111111
 //所以char占用8个bit,截断所以a-11111111
 //反码:10000000000000000000000000000000 
 //原码:10000000000000000000000000000001 
 //%d打印有符号的整数,要看符号位 
 //%u打印无符号的整数,不用看符号位 
 //而char类型大部分编译器是默认为有符号的
 //所以a和b都是运行出来都是-1, 
 //在c里面a->11111111
 //整型提升:无符号整数,高位补0
 //提升:00000000000000000000000011111111 符号位是0代表正数。
 //原码,反码,补码相同,所以c就是255 

例题:运行结果是4294967168

#include<stdio.h>
int main()
{
	char a = -128;
	printf("%u",a);
	return 0;
 } 
 //-128的原码
 //原码:10000000000000000000000010000000 
 //反码:11111111111111111111111101111111
 //补码;11111111111111111111111110000000 
 //char占8个bit,截断8位
 //a——10000000 
 //整形提升,高位时1,有符号位,高位补符号位 
 //提升:11111111111111111111111110000000
 //他其实就是在内存中是补码 
 //%u打印无符号整数,%u的角度,他认为内存中存储的是无符号的整数。
 //所以认位他没有符号位
 //直接打印:11111111111111111111111110000000 
  

例题:有符号整数和无符号整数分别进行打印

#include<stdio.h>
int main()
{
	signed int num = -10; 
	printf("%d\n",num);  //-10
	printf("%u\n",num);  //4294967286
	return 0;
 } 
 
  
#include<stdio.h>
int main()
{
	unsigned int num = -10; 
	printf("%d\n",num);  //-10
	printf("%u\n",num);  //4294967286
	return 0;
 } 
 
  

所以对于按照不同方式打印的,就是要根据他的类型进行判断,是unsigned就用%u打印,是signed就用%d进行打印。

例题:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[1000];
	int i=0;
	for(i=0;i<1000;i++)
	{
		a[i]=-1 - i;
	}
	printf("%d",strlen(a));
	return 0;
 } 
 //运行结果:255
 //strlen是求的字符串的长度,统计的是\0之前出现的字符的个数
 
 
  

就是从-1开始加加加,一直到-128 再加1就是127直到1,所以0之前的个数就是127+128=255,而不是1000.

例题:当无符号整数时全局变量的时候

#include<stdio.h>
unsigned char i = 0;//全局变量 
int main()
{
	for(i=0;i<=255;i++)
	{
		printf("hello world\n");
	}
	return 0;
 } 
 //会一直循环,因为i是无符号字符型。 
 

例题:

#include<stdio.h>
int main()
{
	unsigned char i ; 
	for(i=9;i>=0;i--)
	{
		printf("%u\n",i);
	}
	return 0;
 } 
//会无限循环,unsigned是无符号整数,条件一直成立 
 

标签:存储,符号,int,补码,整数,char,内存,原码
From: https://blog.csdn.net/2401_83201682/article/details/143259374

相关文章

  • SSD和HDD在硬盘存储中有什么区别
    SSD和HDD在硬盘存储中的区别:1.工作原理不同;2.速度和性能;3.可靠性;4.噪音和发热;5.价格;6.存储容量;7.电源效率。硬盘存储一直是计算机系统中不可或缺的一部分,而在硬盘选择方面,固态硬盘(SolidStateDrive,简称SSD)和机械硬盘(HardDiskDrive,简称HDD)是两个备受关注的选项。1.工作原理不......
  • containerd存储fs
    安装nerdctlwgethttps://github.com/containerd/nerdctl/releases/download/v2.0.0-rc.3/nerdctl-full-2.0.0-rc.3-linux-amd64.tar.gztarCxzvvf/usr/localnerdctl-full-2.0.0-rc.3-linux-amd64.tar.gzcontainerd镜像containerd镜像保存在/var/lib/containerd/io.containe......
  • 整数对F1
    给定一个长度为 NN 的数列 A1,A2,⋯,ANA1​,A2​,⋯,AN​。对于一个整数对 x,yx,y(x≤yx≤y),定义公式 F1(x,y)F1(x,y) 为:F1(x,y)=∑k=xyAk=Ax+Ax+1+Ax+2+⋯+AyF1(x,y)=k=x∑y​Ak​=Ax​+Ax+1​+Ax+2​+⋯+Ay​现在,对于所有满足 1≤l≤r≤N1≤l≤r≤N 的整数对 l,rl,r,请......
  • CPU如何通过内存地址访问内存:寻址方式
    寻址方式:物理寻址分段寻址虚拟寻址分页寻址:引申出多级页表起源:寻址方式的发展取决于CPU位数和内存大小,16位就用物理分段寻址,32位用虚拟分段寻址或者2级分页寻址,64位一定用4级分页寻址了CPU的位数决定了:寻址能力:能够直接寻找地址的范围,比如16位的cpu只能找到从0......
  • 如何在ThinkPHP6中使用七牛云存储
    ​在ThinkPHP6中整合七牛云存储需要遵循以下步骤:1.安装七牛云SDK;2.配置API密钥和存储空间;3.实现文件上传功能;4.获取和管理文件;5.整合到ThinkPHP6的框架中。本文将详细指导您如何完成以上操作,使ThinkPHP6项目更加丰富和高效。1.安装七牛云SDK在开启ThinkPHP6与七牛云整合之旅的......
  • linux查看某个进程的内存占用
    在Linux中,查看某个进程的内存占用可以通过多种方法实现。以下是几种常用的方式:1.使用 top 命令top 命令可以实时显示系统中运行的进程,并且显示每个进程的内存使用情况。运行 top 命令:top在 top 界面中,找到你想要查看的进程:%MEM:表示进程使用的物理内存的百分......
  • c语言之正负整数在内存中的存储本质
    int、short、long、longlong是如何定义变量的        我们先从最为我们所知的定义变量入手,当我们用int定义一个变量的时候,这个变量是整型,长度是4个字节,不同的操作系统下由int定义的变量长度有可能不同,当然对于short、long、longlong也是同样如此,因此为了使大家更清......
  • 数据在内存中的储存
    今天我们来深入了解一下各项数据在内存中的存储一.整数在内存中的存储这个众所的周知昂,咱们之前在讲解操作符的时候提到过一嘴,整数在内存中的存储形式——那就是以二进制的形式储存,记不清也没关系,很简单,咱们今天一起来回顾一下:整数的二进制表现形式有三种:原码、反码、补码......
  • C++ (7) 内存管理:掌握魔法能量的流动
    内存管理:掌握魔法能量的流动在C++的魔法世界中,内存管理是一项至关重要的技能。它涉及到程序如何分配和释放内存资源。如果处理不当,可能会导致程序崩溃或内存泄漏,就像一个魔法师失去了对魔法能量的控制。现在,让我们学习如何成为一个负责任的魔法师,掌握内存管理的艺术。6.......
  • 动态内存管理详解
    目录1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free3.calloc和realloc3.1calloc3.2realloc4.常⻅的动态内存的错误4.1对NULL指针的解引⽤操作4.2对动态开辟空间的越界访问4.3对⾮动态开辟内存使⽤free释放4.4使⽤free释放⼀块动态开辟内存的......