#include<stdio.h>
#pragma warning (disable:4996)
int main()
{
char data = -10;//有符号数二进制存储最高位为符号位,最高位1为负,0为正!!!
//-10==10001010(原码)==11110101(反码)==11110110(补码)
printf("%x\n", data);//打印出的结果为f6,所以能看出负数在内存中是按补码存储的!!!
char data1 = 10;//10==00001010(原码)==00001010(反码)==00001010(补码)
//正数的原码反码补码是相同的
printf("%x\n", data1);//打印结果为a,能看出正数是以原码在内存中存储的
char data2 = 0xae;//0xae==10101110
printf("%x\n", data2);//打印结果为ae,0xae=10101110,所以十六进制在内存也是以原码存储
char data3 = 0256;//0256==10101110
printf("%x\n", data3);//打印结果为ae,0xae==10101110,所以八进制在内存中也是以原码存储
char data4 = 129;//超出界限,129==10000001
printf("%x\n", data4);//打印结果为81,0x81==10000001,超出界限的数据在内存中也是以原码存储
unsigned char data5 = -10;//以无符号数据类型存储-10,因为-10在内存中以补码存储
//所以-10==11110110
printf("%x\n", data5);//打印结果为f6,0xf6==11110110,所以无符号的-10在内存中也是以补码存储
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//计算机在存储数据的时候只在乎数据是正数还是负数,是负数就按补码存储,正数就按原码存储
//数据类型只是决定数据空间的大小
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
char data6 = -10;//-10==11110110(补码)
printf("%d\n", data6);//打印结果为-10==10001010(原码)
//所以有符号取:%d %hd %ld,首先看内存的最高位如果为1,是将内存数据符号位不变取反+1得到原码
printf("%u\n", data6&0x000000ff);//打印结果为246==11110110
//所以无符号取:将内存数据原样输出
char data7 = 10;//10=00001010
printf("%d\n", data7);//打印结果为10==00001010
//所以有符号取:%d %hd %ld,最高位如果为0 将数据原样输出。
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!
//取:%d %hd %ld(有符号取) %u %x %o %lu都是(无符号取)
//有符号取:%d %hd %ld
//首先看内存的最高位如果为1 将内存数据符号位不变取反+1到原码
//最高位如果为0 将数据原样输出。
//无符号取:将内存数据原样输出
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!
return 0;
}