本次讨论C语言一个小玩意,关于C语言计算机存储与位运算
void t1(void)
{
int a;
printf("%d",a);//十进制表示
printf("%#o",a);//八进制表示
printf("%#x",a);//十六进制表示,小写x十六进制字母小写
printf("%#X",a);//大写X字母大写
//加上#号数字前有前缀,更直观
int b=0123;//八进制赋值
int c=0x12a;//十六进制赋值
}
void t2(void)
{
//原码 有符号(取最高位为符号位)与无符号
//反码 有符号的正数与无符号和原码情况相同
//负数 原码符号位不动,其余位取反
//补码 符号的正数与无符号和原码情况相同
//负数 原码符号位不动,其余位取反 +1
//无符号 原码=反码=补码
//有符号 正数:原码=反码=补码
//无符号 负数: 补码=反码+1
//数据在计算机内以补码的方式存储
//取数据 无符号直接取
//有符号 最高位为0,直接输出 最高位为1 原码=补码符号位不动,其余位取反 +1
// 1000 1111->1111 0000->1111 0001->1000 1110->1000 1111
// 原码 反码 补码 ( 原码 )
//八进制与十六进制原码=反码=补码
//%d等等有符号,%u等等无符号
//补码的意义
//+0与-0补码没有差别1000 0000、0000 0000
//补码做运算的时候正确
}
int main()
{
//char num=-15;//1000 1111->1111 0001->128+64+32+16+1
//printf("%u\n",num);
char num=0x9b;//1001 1011 ->1110 0101(-1-4-32-64)
printf("%d",num);
}
//按位(补码)取反 ~ 0变1,1变0
//按位与 & 全1为1,其余为0 用处:判断奇偶
//按位或 | 全0为0,其余为1 用处:让指定位置为1
//按位异或 ^ 相同为1,不同为0 A^B=C =>A^C=B 用处:交换数字
//移位运算符 左移:<< 右移:>>
//<<1 原数乘以2 <<N即原数乘以2^N
//>>N 即原数除以2^N 除不尽的减一再除
//右移一般用0填充,可某些系统负数高位用1填充
int main()
{
int num1=2;//0000 0000 0000 0000 0000 0000 0000 0010->0000 0000 0000 0000 0000 0000 0000 0010
//->1111 1111 1111 1111 1111 1111 1111 1101->1000 0000 0000 0000 0000 0000 0000 0011
//printf("%d\n",~num);
int num2=-2;//1000 0000 0000 0000 0000 0000 0000 0010->1111 1111 1111 1111 1111 1111 1111 1110
//->0000 0000 0000 0000 0000 0000 0000 0001->0000 0000 0000 0000 0000 0000 0000 0001
//printf("%d",~num2);
//和数字1按位与运算
//1110 0001
//0000 0001
//按位与 为1奇数,为0偶数
//if((num1&1)==0) printf("%d是偶数",num1);
//else printf("%d是奇数",num1);
int num3=5;
int num4=3;
//printf("%d",num3|num4);
num3=num3^num4;
num4=num3^num4;
num3=num3^num4;
//printf("%d %d",num3,num4);
int num=10;//0110
printf("%d",10>>2);
}
原文地址:https://www.cnblogs.com/tzp-empty-hya/p/14383575.html