取反~
int a=0;
printf("%d\n",~a);
000000000000000000000000000000000
111111111111111111111111111111111 - 补码
111111111111111111111111111111110 - 反码(补码-1)
100000000000000000000000000000001 - 原码(反码取反,符号位不变)
打印出来的是原码,存储在内存的是补码。
int main()
{
short s=0;
int a=10;
printf("%d\n",sizeof(s=a+5));
printf("%d\n",s);
return 0;
}
结果是2和0。
原因:sizeof计算内存大小。但sizeof里面的表达式并不会计算。
#include<stdio.h>
int main()
{
int i=0,a=0,b=2,c=3,d=4;
i=a++&&++b&&d++;
printf("a=%d\n,b=%d\n,c=%d\n,d=%d\n",a,b,c,d);
return 0;
}
结果 1,2,3,4
i=a++ 为0,假,不继续执行后面的语句。
#include<stdio.h>
int main()
{
int i=0,a=1,b=2,c=3,d=4;
i=a++||++b||d++;
printf("a=%d\n,b=%d\n,c=%d\n,d=%d\n",a,b,c,d);
return 0;
}
结果 2,2,3,4
i=a++ 为1,为真,不继续执行后面的语句。
隐式类型转换
整形提升(计算时数据变成int型)
#include<stdio.h>
int main()
{
char a=3;
//00000011 - a
//00000000000000000000000000000011
char b=127;
//01111111 - b
//00000000000000000000000001111111
//a与b相加
//00000000000000000000000000000011
//00000000000000000000000001111111
//相加
//00000000000000000000000010000010
//截断
//10000010
char c=a+b;
//10000010
//11111111111111111111111110000010 - 补码
//11111111111111111111111110000001 - 反码
//10000000000000000000000001111110 - 原码
printf("%d\n",c);
return 0;
#include<stdio.h>
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
}
结果为c。==也算是一种运算。
#include<stdio.h>
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
结果为1 4 1 。+c让c变成了从char的一个字节变成了四个字节