C杂讲 数据编码与存取

知识点1【原码 反码 补码】

注意:

无符号数正数:他们的 原码==反码==补码

负数:反码=原码的符号位不变 其他位取反

补码=反+1.

(重要):负数在计算机中存储的是补码

计算机 为啥 要补码?

以1字节分析:

如果没有补码:

6-10== -4

6+(-10) == -4

0000 0110

1000 1010

--------------

1001 0000 == -16(错误)

如果有补码:

0000 0110

1111 0110

----------------------

1111 1100----->1000 0011--->1000 0100==>-4

总结:补码的意义-将减法运算 变加法运算

以1字节分析:

有符号符:1111 1111~1000 0000~0000 0000~0111 1111

-127 ~ -0 ~ +0 ~ +127

计算机为了扩数据的表示范围:故意将-0看成-128

-128~127

无符号数:0000 0000 ~ 1111 1111 == 0~255

总结:补码统一 0 的编码。

+0 == 0000 0000==0000 0000(反码)==0000 0000(补码)

-0 == 1000 0000 ==1111 1111(反码)==0000 0000(补码)

总结:补码意义:将减法运算 变加法运算 同时统一了0的编码

知识点2【计算机对数据的存储 与 读取】

存储:

#include<stdio.h>

void test01()//存储
{
	//负数 以补码 存储
	char data = -10;
	//正数 以原码 存储
	char data2 = 10;
	//十六进制 以 原码存储
	char data3 = 0xae;//0xae==1010 1110
	//八进制   以 原码存储
	char data4 = 0256;//0256==1010 1110
	//每3位二进制 代表 一位八进制
	//如果数据越界 以原码 存储
	char data5 = 129;//1000 0001

	unsigned char data6 = -10;//0000 1010


	//取 %x %u %o 都是输出内存的原样数据
	//每4位二进制 代表 一位十六进制(记住)
	printf("%x\n", data);//0xf6==1111 0110

	printf("%x\n",data2);//0x0a ==0000 1010

	printf("%x\n",data3);//0xae

	printf("%x\n",data4);//0xae
	
	printf("%x\n",data5);//0x81
	printf("%x\n",data6);//0xfb

}
int main(int argc,char *argv[])
{
	test01();
	return 0;
}

 取:

void test02()
{
	char data1 = -10;
	char data2 = 10;
	
	//取:%d %hd %ld有符号取   %u %x %o %lu都是无符号取 
	//有符号取:%d %hd %ld
		//首先看内存的最高位如果为1 将内存数据符号位不变取反+1到原码
		//最高位如果为0 将数据原样输出。
	//无符号取:将内存数据原样输出
	printf("%d\n",data1);//-10
 
	//data1&0x000000ff 只取低8位
	printf("%u\n",data1&0x000000ff);//246==1111 0110

	printf("%d\n",data2);//10
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值