1 .>> 右移操作符
int a=16用二进制表达2为00000000000000000000000000010000
像右移操作符有两种移法
右边丢弃左边补符号位 相当于除2
整数的二进制表示有:原码 反码 补码
进行移位操作时操作的是补码 正数的补码是他本身 负数的补码是原码按位取反加1(除了符号位)
左移操作符使值扩大两倍
按位与& E6TRGDEWRTHGRWDEQTRGHEF1QRFTGHERSQW2HFBGTY26YU7T342RHNJUGCFBGHJNTV a 补码进行操作 全为1则为1否则为0
按位或| 补码进行操作 有一个为1则为1 否则为 0
按位异或 ^ 补码进行操作 相同则为0 否则为1
赋值操作符可以连续使用
a=x=y+1
int i = 0;
int temp = 0;
int count = 0;
int des;
/* printf("%d",15>>33);*/
printf("请输入数字");
scanf("%d",&temp);
for ( i = 0; i <32; i++)
{
if (1 == (temp >> i & 1)) {
count++;
printf("%d %d\n", i, temp >> i);
}
des = temp / 2;
if (des < 0) {
break;
}
{
}
}
printf("一共有%d个1", count);
注意这里条件要不能包括32 因为移动相当于位宽时会看编译器,可能导致答案错误
答案为2,0
因为把a+5的结果放进来s里面 s是shrot类型 所以sizeof判断的是short的所占空间大小
s=0是因为sizeof里面的代码不会进行真实的运算
11的二进制为1011 前面的0就不补了
1011 ->1111
1011 | 4
前面几位都是0
char a = 3;
char b = 127;
char c = a + b;
printf("%d",c);
a的二进制表示为00000000000000000000000000000011
b的二进制表示为000000000000000000000000001111111
要转成补码运算 因为正数三码合一
因为他们都是char类型占1字节所以要进行阶段从低位开始取
a 00000011
b 011111111
按照规定进行整形提升往前面补符号位直到32bit为止
整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整型首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。
a 00000000000000000000000000000011
b 000000000000000000000000001111111
a+b=
000000000000000000000000010000010
然后要放到char类型要进行截断
c=10000010
要进行整数输出还要进行整形提升 补符号位
11111111111111111111111110000010
然后这是补码要变成原码
11111111111111111111111110000001 反码
100000000000000000000011111110
所以整数输出为-127
整个过程进行了两次整形提升
两次截断
int count_one_bits(unsigned int value)
{
// 返回 1的位数
int i = 0;
int count = 0;
for (i = 0; i < 32; i++) {
if (1 == (value>>i & 1)) {
count++;
}
}
return count;
}
分别输出二进制序列。
int a = 0;
int i = 0;
scanf("%d",&a);
for (i = 31; i > -1; i--) {
printf("%d",(a>>i&1));
}
printf("\n偶数位\n");
for (i = 31; i > -1; i -= 2) {
printf("%d", (a >> i & 1));
}
printf("\n奇数位\n");
for (i = 30; i > -1; i -= 2) {
printf("%d", (a >> i & 1));
}
int a = 0;
int i = 0;
int count = 0;
int b = 0;
scanf("%d %d", &a,&b);
for ( i = 0; i < 32; i++)
{
if ((a>>i&1)!=(b>>i&1))
{
count++;
}
}
printf("%d", count);
ques1:
既然所有指针的大小都是四字节,为什么还要区分这么多类型吗 比如int* char * short*
可以看到存储地址确实没有什么大问题
int a = 0x11223344;
//char* b = &a;
int* c = &a;
*c = 0;
通过使用相同类型的指针可以成功修改值
int a = 0x11223344;
char* c = &a;
//int* c = &a;
*c = 0;
使用插char类型的指针操作int数据,只操作了一个字节
结论:指针类型决定了指针解引用能够访问空间的大小
第二个意义:
指针加减整数
指针的类型决定了指针一步走多远也就是步长距离的单位就是字节数
:指针指向的位置是不可知的