数据在内存中是以二进制的形式存放的。
一个字节由八位二进制位组成
一个二进制位由0.1两种状态表示
例:一个int在内存中占4个字节=32位
一.移位 *** 作符1.左移运算符<<
左边抛弃,右边补0,正数和负数不一样
int main() { //正数 int a = 5; int b = a << 1; //负数 int a = -5; int b = a << 1; printf("%d",b); } -5的原码是100000000000000000000000000/0101 反码是111111111111111111111111111/1010 补码是111111111111111111111111111/1011 11111111111111111111111111/10110 //将补码左移一位 再将补码转化成原码
2.右移运算符>>,分为算术右移和逻辑右移
当为正数时,最高位一般补0;当为负数时,补0还是1,取决于编译系统的决定
int main() { int x = 30, y = -30; x = x >> 3; y = y >> 3; printf("%d %d",x,y); } -30的原码100000000000000000000000/0001 1110 反码111111111111111111111111/1110 0001 补码111111111111111111111111/1110 0010 111111111111111111111111/1110 0/010 111111111111111111111111111/1110 0二.
&:两个都为1,才为1;否则为0;
|:只要一个为1,就为1;
^:相异为1;相同为0;
面试题:
不能创建临时变量(第三个变量),实现两个数的交换
int main() { int a = 10; int b = 20; a = a + b; b = a - b; a = a - b; printf("%d %d",a,b); return 0; }
int main() { int a = 10; int b = 20; a = a^b; b = a^b; a = a^b; printf("a = %d b = %dn", a, b); retunrn 0; }
练习:
编写代码实现:求一个整数存储在内存中的二进制中1的个数
1的补码:00000000000000000000000000000001
00000000000000000000000000001101
思路:利用for循环,每次>>左移,然后按位与&1
int main() { int a = 0; scanf_s("%d",&a); int count = 0; int i; for ( i = 0; i < 32; i++) { if (1==((a>>i)&1)) { count++; } } printf("%d",count); }三.
sizeof可以求变量(类型)所占空间的大小(单位字节)
#include四.360笔试题void test1(int*arr) { printf("%dn", sizeof(arr));//(2) } void test2(char*ch) { printf("%dn", sizeof(ch));//(4) } int main() { int arr[10] = {0}; char ch[10] = {0}; printf("%dn", sizeof(arr));//(1) printf("%dn", sizeof(ch));//(3) test1(arr); test2(ch); return 0; } 问: (1)、(3)两个地方分别输出多少?40 10 (2)、(4)两个地方分别输出多少?4 4/8 地址
includeint main() { int i = 0,a=0,b=2,c =3,d=4; i = a++ && ++b && d++; printf("a = %dn b = %dn c = %dnd = %dn", a, b, c, d); return 0; } //程序输出的结果是什么? a=0为假--只要有一个为假其余都是假,不用算了 而a++为后置,算完a&&++b后再自增 答案:1 2 3 4
2 3 3 5
2 2 3 4
||:两个表达式都为假时,逻辑运算结果为假
只要一个为真,结果为真
&&:两个表达式都为真时,结果才为真
只要一个为假,结果就为假
逗号表达式
value=2+5,1+2,5+7; 7 value=(2+5,1+2,5+7); 12 赋值运算符优先级比逗号表达式高五.整形提升
隐式类型转换之整形提升_rain67的博客-CSDN博客
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)