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 }

 

 

转载于:https://www.cnblogs.com/songliquan/p/4415893.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值