位操作与二进制学习

----------内存--------------
#include<stdio.h>

void main1()
{
	printf("%d\n", 10.3);//-1717986918
	printf("%f\n", 10);//0.000000
	//printf不管什么数据,按照%d,%f解析数据
	printf("%d\n", (int)10.3);//10
	printf("%f\n", (float)10);//10.000000

	getchar();
}

void main2()
{
	int num = 100;
	printf("%p", &num);//不一样的解析方式结果不一样

	getchar();
}

void main3()
{
	char ch = 1;
	char ch1 = '1';//字符和编号的区别
	printf("%d,%d", ch,ch1);//1,49

	getchar();
}

void main4()
{
	//解析的时候,与数据长度有关系
	//unsigned short num = 65535;
	//printf("我有%d元钱\n", num);//65535
	unsigned short num = 65535+1;
	printf("我有%d元钱\n", num);//0
	//数据的溢出
	getchar();
}

void main5()
{
	//补码,计算机储存数据的方式
	short n = -1;
	printf("%d\n", n);//-1
	printf("%u\n", n);//4294967295,%u 0-正整数

	getchar();
}


-----------计算机补码--------------

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>//极限

void main6()
{
	int x = 1;
	int y = -1;//补码
	printf("x=%p,y=%p", &x, &y);

	getchar();
}

void main7()
{
	//int,unsigned int都是4个字节32位
	//三位数十进制最小000,最大999
	//二进制无符号最大值32个1,整数,都是数据
    //有符号,0代表整数,1代表负数,少一位用来代表符号
	printf("%d,%d\n", INT_MAX, INT_MIN);//%d只能显示极限内的数字
	printf("%u,%u\n", UINT_MAX, 0);

	getchar();
}

void main8()
{
	int q = 4294967295;
	int e = -1;
	//1111 1111 1111 1111 1111 1111 1111 1111内存的储存方式
	//无符号,没有符号位,全部都是数据4294967295

	//0000 0000 0000 0000 0000 0000 0000 0001   1的源码 
	//1000 0000 0000 0000 0000 0000 0000 0001   -1的源码 
	//1111 1111 1111 1111 1111 1111 1111 1110   -1的反码(符号位不变,其他1变0,0变1)
	//1111 1111 1111 1111 1111 1111 1111 1111   -1的补码,反码+1
	//在计算机里负数是按照补码存放的
	
	printf("%d,%u\n", q,q);//-1,4294967295,有符号位和无符号位的区别
	printf("%d,%u\n", e, e);//-1,4294967295
	//%d,第一位抓取当符号,%u全是数据

	getchar();
}

void main()
{
	unsigned int num = -1;
	printf("%d,%u", num, num);//-1,4294967295

	getchar();
}

-------补码实战-------------
//任意输入int类型数据,打印内存的二进制储存
void mainA()
{
	//int类型占4个字节,四个字节32位
	int num;
	scanf_s("%d", &num);
	printf("\nnum=%d,&num=%p\n", num, &num);
	int data = 1 << 31;//构建一个相与的数据,1左移31,1前面填充31个0
	//如果要求源码,需要加一个步骤
	//if (num < 0)
	//{
		//num = ~num + 1;//求源码   ~是取反码  源码=反码取反再+1
	    //num=num|data;//设置符号位
	//}

	for (int i = 1; i <= 32; i++)
	{
		if ((num&data) == 0)
		{
			putchar('0');
		}
		else
		{
			putchar('1');
		}
		num <<= 1;
		if (i % 4 == 0)
		{
			printf(" ");
		}
	}

	system("pause");
}
//&可以清零某些指定位数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值