运算符
二进制、八进制和十六进制
二进制数、位、字节与字
一个位只能表示0或者1两种状态,简称bit,一个位就是一个bit
一个字节为8个二进制,称为8位,简称BYTE,8个比特是一个字节
一个字为2个字节,简称WORD
两个字为双字,简称DWORD
八进制
8进制为以8为基数的数制系统,C语言当中0表示八进制,如0100(10进制为64)
#include <stdio.h>
int main()
{
printf("%d\n",0100);//output 64
printf("%d\n",100);//output 100
printf("%d\n",0x10);//output 16
printf("%u\n",-10);//无符号输出
printf("%x\n",-10);//十六进制输出
return 0;
}
十六进制
十六进制以16为基数的数制系统,C语言中用0x表示十六进制
十进制 | 十六进制 | 二进制 | 八进制 |
---|---|---|---|
0 | 0 | 0000 | 0 |
1 | 1 | 0001 | 1 |
2 | 2 | 0010 | 2 |
3 | 3 | 0011 | 3 |
4 | 4 | 0100 | 4 |
5 | 5 | 0101 | 5 |
6 | 6 | 0111 | 6 |
7 | 7 | 0111 | 7 |
8 | 8 | 1000 | 10 |
9 | 9 | 1001 | 11 |
10 | a | 1010 | 12 |
11 | b | 1011 | 13 |
12 | c | 1100 | 14 |
13 | d | 1101 | 15 |
14 | e | 1110 | 16 |
15 | f | 1111 | 17 |
16 | 10 | 10000 | 20 |
17 | 11 | 10001 | 21 |
进制之间的转化
参考链接:http://www.cnblogs.com/gaizai/p/4233780.html#_labelConvert42
原码
将最高位作为符号位(0代表正,1代表负),其余各位代表数值本身的绝对值
+7 的原码是 0000 0111
-7 的原码是 1000 0111
+0 的原码是 0000 0000
-0 的原码是 1000 0000
反码
一个数如果值为正,那么反码和原码相同
一个数如果值为负,那么符号位为1,其他位与原码相反
+7 的反码是 0000 0111
-7 的反码是 1111 1000
-0 的反码是 1111 1111
补码
原码和反码不利于计算机的运算,如原码表示的7和-7想加,还需要判断符号位。
正数:原码、反码、补码都相同
负数:最高位为1,其余位为原码取反,最后对整个数+1
补码符号位不动,其他位求反,最后整个数加1,得到原码
求-7的补码
1000 0111(原码)
1111 1000(反码)
1111 1001(补码)
参考链接:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
siezof关键字
sizeof是C语言的关键字,功能是求指定数据类型在内存中的大小,单位为:字节
C语言数据类型
int类型
int 就是32位的一个二进制整数,在内存中占据4个字节的空间。int不管是32位系统还是64位系统,不管是windows还是unix都是占用4个字节
short
代表短整数,在32位系统下,是占用两个字节,16个比特
long
long代表是长整数,在32位系统下,long都是4个字节的;在64位系统下,windows还是占用4个字节,unix下成了8个字节
long long
long long是占用64位,也就是8个字节大小的整数,对于32位系统,CPU寄存器是32位,所以计算long long类型的数据,效率很低
整数溢出
计算一个整数的时候,超过整数能够容纳的最大单位后,整数会溢出,溢出的结果是最高位舍弃
当一个小字节的整数赋值给大字节的整数,符号位不会丢失,会继承
#include <stdio.h>
int main()
{
short abc;
int i = 0x12345678;
abc = i;
printf("%x\n",abc);
short b = -2;
i = b;
printf("%x\n",i);
unsigned short c = 0;
c = c - 1;
printf("%d\n",c);
return 0;
}
大端对齐与小端对齐
对于arm、intel这种X86架构的复杂指令CPU,整数在内存中是倒着放的,低地址放地位,高地址放高位,小端对齐。
但对于Unix服务器的CPU,更多的是才用大端对齐的方式存放整数
char类型
char的本质就是一个整数,一个只有一个字节的整数
char 取值范围位-128到127
unsigned char 为0-255
浮点float、double、long double类型
浮点数的效率是很低的,如果只是整数运算,那么就避免使用浮点数
float 在32位系统上是占用4个字节,在64位是占用8个字节
类型限定
const
volatile
代表变量是一个可能被CPU指令外的其他设备改变的,编译器就不会针对这个变量去优化目标代码
#include <stdio.h>
int main()
{
//告诉编译器,不要针对这个变量优化代码
volatile int i = 100;
i = i +5;
//外部设备量改变了 i 的值
i = i +10;
i = i + 30;
// i = i + 45;//如果不声明的话,会被编译器优化成这样
printf("%d\n",i);
return 0;
}
- register
声明变量 是在CPU寄存器里面,而不是在内存里。但是register是建议型的指令,而不是命令型的指令
字符串在计算机内部的存储方式
字符串是内存中一段连续的char空间,以‘\0’结尾
printf关键字
%d 输出10进制整数
%x 输出16进制小写
%X 输出16进制大写
%u 输出无符号10进制整数
%o 输出8进制整数
%p 显示内存的地址
%f 输出浮点数
scanf
通过键盘读取用户输入
#include <stdio.h>
int main()
{
int a= 0;
int b = 0;
scanf("%d",&a);//一定要用&取变量的地址
scanf("%d",&b);//一定要用&取变量的地址
printf("a + b = %d\n",a+b);
return 0;
}
类型转化
#include <stdio.h>
int main()
{
// double f = 3/2;//C语言中两个整数相除的结果自动转为整数
double f= (double)3/2;
printf("%f\n",f);
return 0;
}