ios开发学习笔记004-进制与位运算
进制
二进制 0 1组成,封2进1
八进制 0~7组成,封8进1
十进制 0~9组成,封10进1
十六进制 0~15组成,封16进1
printf以不同进制形式进行输出
变量的内存地址形式
变量在内存中是从高地址到低地址依次保存的,并且只保存二进制
查看内存地址的两种方式:%x和%p
各个类型变量的取值范围
类型修饰符
在64bit编译器环境下,
int占用4个字节(32bit),取值范围是-231~231-1;
short占用2个字节(16bit),取值范围是-215~215-1;
long占用8个字节(64bit),取值范围是-263~263-1。
可以连续使用2个long,也就是long long。一般来说,long long的范围是不小于long的,比如在32bit编译器环境下,long long占用8个字节,long占用4个字节。不过在64bit编译器环境下,long long跟long是一样的,都占用8个字节。
注意:short int等价于short,long int等价于long,long long int等价于long long
signed和unsigned
signed:表示有符号,也就是说最高位要当做符号位,所以包括正数、负数和0。
unsigned:表示无符号,也就是说最高位并不当做符号位,所 以不包括负数。
signed int a; a的取值范围是l -231 ~ 231 - 1
unsigned int a; a的取值范围是0 ~ 232 - 1
位运算
1. & 按位与:只有对应的两个二进位均为1时,结果位才为1,否则为0。
2. | 按位或:只要对应的二个二进位有一个为1时,结果位就为1,否则为0。
3. ^ 按位异或:当对应的二进位相异(不相同)时,结果为1,否则为0。
4. ~ 取反:对整数a的各二进位进行取反,符号位也取反(0变1,1变0)
5. << 左移:把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方。由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性。
6. >> 右移: 把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方,为正数时, 符号位为0,最高位补0,为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。
转义字符
除了这些字符,其他的字符都可直接输出。
下面是代码示例,再Xcode下有时会出现一些莫名其妙的问题。再vs2013下就没问题。比如说异或字符 ^,在xcode下有警告,vs2013下没有。
1 #include <stdio.h> 2 3 /* 4 修饰符 5 unsigned//无符号数,没有正负号 6 signed//有符号数,最高位位符号位,表示这个数的正负。 7 char //都是1个字节 8 int //64位下4个字节 9 long //64位下8个字节 10 long long //64位下也是8个字节 11 short //short 类型2个字节 12 float //都是4个字节 13 double //都是8个字节 14 15 16 */ 17 18 //函数声明 19 //输出整数的二进制形式 20 void intToBinary(int n); 21 int main() 22 { 23 //每个类型占得长度 24 /* printf("char length is :%lu\n",sizeof(char)); 25 printf("short length is :%lu\n",sizeof(short)); 26 printf("int length is :%lu\n",sizeof(int)); 27 printf("long length is :%lu\n",sizeof(long)); 28 printf("long long length is :%lu\n",sizeof(long long)); 29 printf("float length is :%lu\n",sizeof(float)); 30 printf("double length is :%lu\n",sizeof(double)); 31 printf("int * length is :%lu\n",sizeof(int *)); 32 33 //内存地址的分配时从高位到低位,并且以二进制存储 34 int n1 = 111; 35 int n2 = 222; 36 37 //打印内存地址有两种形式 %x和%p 38 printf(" n1 Address is :%x\n",&n1);//测试结果 5e6ebc28(%x) 39 printf(" n2 Address is :%p\n",&n2);//测试结果 0x7fff5614ec24(%p) 40 */ 41 int a = 111; 42 unsigned int a1 = 111; 43 signed int a2 = 111;//signed int == int,int默认就是unsigned 44 45 short a3 = 111;//short == short int 46 short int a4 = 111; 47 48 49 long int la = 111;//long int == long 50 long long int lla = 111;//long long int == long long 51 unsigned long int ula = 111;//unsinged long int == unsigned long 52 signed long int sln = 111;//默认是signed,signed long == long 53 54 //取值范围 55 //int len1 = 12345678910111213141516; 56 //printf("%d\n",len1);//123456789 57 58 //位运算, 59 //& 与 ,同时为1结果为1,否则是0 60 //| 或,只要有一个为1结果为1,同时是0为0 61 //~ 取反,1变0,0变1 62 //^ 异或,相异取1,否则取0 63 //>> 右移,保持符号位不变,正数补0,负数补0还是1由变异系统确定 64 //<< 左移,高位丢弃,低位补0,会失去符号位,改变正负性 65 int byte1 = 8; 66 int byte2 = 2; 67 printf("3&3与: %d\n",byte1&3); 68 printf("3&2与: %d\n",byte1&byte2); 69 printf("3|3或: %d\n",byte1|3); 70 printf("3|2或: %d\n",byte1|2); 71 printf("~3取反: %d\n",~byte1); 72 printf("3^2异或 %d\n",byte1^byte2); 73 printf("3^3异或 %d\n",byte1^3); 74 printf("2>>2右移 %d\n",byte2>>2); 75 printf("2<<2左移 %d\n",byte2<<2); 76 //交换两个变量的值 77 printf("byte1 %d\n",byte1); 78 printf("byte2 %d\n",byte2); 79 byte1 = byte1 ^ byte2; 80 byte2 = byte1 ^ byte2; 81 byte1 = byte1 ^ byte2; 82 printf("after exchange\n"); 83 printf("byte1 %d\n",byte1); 84 printf("byte2 %d\n",byte2); 85 //转义字符 86 // ^ 在Xcode下会有警告,不明白,可能是编译器的问题 87 printf("sda\t\"\'\\`!@#$%^&*()_+\n\0"); 88 89 90 //整数转换二进制输出 91 intToBinary(a); 92 93 return 0; 94 } 95 96 //函数定义 97 void intToBinary(int n) 98 { 99 int bits = sizeof(n)*8;//二进制长度 100 while (bits-->0)//循环遍历每一个二进制位 101 { 102 printf("%d",n>>bits&1);//右移bits位,从最高位开始取值,和1相与,结果就是0取0,1取1 103 if (bits%4 == 0)//四位一组输出 104 { 105 printf(" "); 106 } 107 } 108 }
本文来自博客园,作者:struggle_time,转载请注明原文链接:https://www.cnblogs.com/songliquan/p/4415893.html