一、进制
1、定义:是一种计数的方式,数值的表示形式。
2、常用的4种进制:
二进制以0b/0B开头如 int num1 = 0b1100;
八进制以0开头如 int num2 = 014;
十进制如 int num3 = 12;
十六进制以0x/0X开头如 int num4=0xc;
3、输出格式符
4、进制的转换
a、二进制转十进制 0b1100=1*2的3次方+1*2的2次方+0*2的1次方+0*2的0次方=12
b、十进制转二进制 56=32+16+8=2的5次方+2的4次方+2的3次方=0b111000
5、n位二进制的取值范围:0 ~ 2的n次方-1。
二、变量的内存分析
1、内存是由大到小寻址,只存储二进制形式。
a、数值在内存中的存储:例:12是0000 0000 0000 0000 0000 0000 0000 1100
b、负值在内存中的存储:例:-12是1111 1111 1111 1111 1111 1111 1111 0100
c、最前位是符号位,是0则为正数,是1则为负数。
d、负数的存储涉及到了原码、反码、补码。
2、基本数据类型的取值范围:
3、例:
int main()
{
// 一个int类型数据占据4个字节、32bit
// 0000 0000 0000 0000 0000 0000 0000 1100
int number = 12; // 1100
// 0000 0000 0000 0000 0000 0000 0000 1101
int number2 = 13; // 1101
return 0;
}
三、类型说明符![]()
1、short 2个字节 %d输出
short == short int;short a = 1和short int a = 1;是相同的;
2、long 8个字节(扩充整型数据,扩充为8个字节) %ld输出
long == long int;一般有l来修饰说明是long类型;如long int a = 12345678901234l;
3、longlong 8个字节 %lld输出
long long == long long int;一般有ll来修饰说明是long long 类型;如long long int a = 12345678901234ll;
4、signed代表有符号 最高位是符号位 -2的31次方~ 2的31次方-1 %d输出;
5、unsigned代表无符号 最高位不是符号位 0 ~ 2的32次方-1 %u输出;
signed和unsigned都是4个字节,signed和int是一样的,unsigned的最高位不要当做符号位。
long unsigned int a = 23894234;
四、位运算
1、&按位与:只有对应的两个二进位均为1时,结果位才为1,否则为0。
12&5结果是4;
1100
0101 =>0100是4的二进制。
作用:可以精确的获取某一个精确位;
使用位与&运算符变量的奇偶性:
a&1 == 1; //a为奇数
a&1 == 0; //a为偶数
2、|按位或:只要对应的二个二进位有一个为1时,结果位就为1,否则为0。
16|5结果是13
1100
0101 =>1101是13的二进制。
3、^按位异或:当对应的二进位相异(不相同)时,结果为1,否则为0。
12^5结果是9
1100
0101 =>1001是9的二进制。
规律:
- 相同整数相^的结果是0;5^5==0;
- 多个整数相^的结果跟顺序无关;5^6^7==5^7^6
- 任何数值和0进行^,结果还是原来的数值;5^0==5
- a^b^a==b;
例:不引入其他变量的情况下,使用异或^运算符实现两个变量值的互换:
#include <stdio.h>
int main()
{
int a =10,b=12;
a=a^b;
b=a^b;
a=a^b;
printf(“a=%d,b=%d\n”,a,b)
return 0;
}
4、~按位取反
~0000 0000 0000 0000 0000 0000 0000 1001
1111 1111 1111 1111 1111 1111 1111 0110
printf(“%d\n”,~9);输出的是-10;
5、<<左移
a << n => a * 2的n次方;
a、把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方;b、由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃。
b、左移出来的结果值可能会改变正负性;
6、>>右移
a >> n => a /2的n次方;
a、把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方。
b、为正数时, 符号位为0,最高位补0;为负数时,符号位为1,最高位补1。
7、例:编写一个函数,用来输出整数在内存中的二进制形式:
void printBinary(int number)
{
//记录现在挪到第几位
int temp = (sizeof(number)<<3) - 1;//相当于sizeof(number) * 8 - 1
while (temp >= 0) {
// 先挪位,再&1,取出对应位的值
int value = (number >> temp) & 1;
printf(“%d",value);
// 每输出4位,就输出一个空格
if( temp % 4 == 0)
{
printf(" ");
}
temp--;
}
printf("\n");
}
五、char类型
1、字符的存储是参照ASCII码表转成数值然后将二进制存入内存;
a、char c= ‘A’ 存在内存中是占1个字节 存入的形式是0100 0001;
b、大写字母与小写字母差值固定32;’A’是65,’a’是97;
2、int num=6;存入内存为6的二进制:0000 0000 0000 0000 0000 0000 0000 0110;
char a = ‘6’;存入内存为’6’的ASCII码值:是54的二进制:00110110;
3、注意
a、单引号只能括住单字节的字符。
b、错误的写法:char c = A;char c = "A";char c = 'ABCD';char c = '男';
c、正确的写法:char c= ‘A’; char c = 65;
d、例:
#include <stdio.h>
int main()
{
char c = ‘A’;
switch(c)
{
case ‘A’ : printf(“1\n”);break;
case ‘B’ : printf(“2\n”);break;
//case 65 : printf(“3\n”);break;//这个和case ‘A’是重复的,都写会报错
default: printf(“4\n”);break;
}
return 0;
}
4、当做整型使用:在-128~127范围内,可以当做整数来用
5、转义字符 \
\n回车换行10;
\tTAB 9;
\\一个反斜线字符92;
\'一个单引号字符39;
\”一个双引号字符34;
\0空字符0;
6、实例:小写转大写
#include <stdio.h>
int main()
{
char upper(char);
char c = upper(‘A’);
printf(“%c\n”,c);
return 0;
}
char upper(char c)
{
if(c >= ‘a’ && c<=’z’)
{
return c – (‘a’ - ‘A’);
}
return c;
}