C语言-05-内存分析
2015-08-10 12:52
218 查看
一、进制
1> 内存细节
根据数据类型分配相应大小的内存空间
内存空间由高地址向低地址分配
数据一般按照从高位到低位存储
2> 常用的进制格式
十进制
二进制
八进制
十六进制
3> 进制之间的转换
二进制与十进制
二进制与八进制
二进制与十六进制
八进制、十六进制与十进制
4> 类型说明符
long和short
signed 和unsigned
5> n位2进制数的取值范围
signed修饰
unsigned修饰
6> 示例
二、位运算
1> 按位与(&)
全1才为1,否则为0
可以某个二进制位的值
2> 按位或(|)
全0才为0,否则为1
3> 按位异或(~)
相同为0,不同为1
某个数异或自己为0,异或0为自己
异或运算可以交换
异或可以用于交换两个变量的值
4> 按位取反(^)
0变为1,1变为0
按位取反连同符号位一块取反
5> 左移(<<)
低位补0,溢出位舍弃
符号位可能会被舍弃,正负性可能会改变
某个数左移n为等价于该数乘以2的n次幂
左移的效率比乘法高
6> 右移(>>)
负数右移,高位补1,溢出位舍弃
整数右移,高位补0,溢出位舍弃
某个数右移n为等价于该数除以2的n次幂
右移的效率比除法高
7> 示例(该示例使用代码块)
三、char类型
1> 内存细节
占用一个字节大小的内存
在内存中以ASCII码(一个整数)形式存储
2> 使用注意
char类型可以存储一定范围的整形数据(0~127)
char类型可以进行自动类型提升整型,可以像操作整形数据一样操作char型数据
具有特殊含义的字符用printf函数输出时,要先转化为转义字符
将整数转化为字符,一般用这个整数加上'0',即为这个整数的字符形式
3> 示例
1> 内存细节
根据数据类型分配相应大小的内存空间
内存空间由高地址向低地址分配
数据一般按照从高位到低位存储
2> 常用的进制格式
十进制
① 由0~9十个数字组成 ② 逢10进1 ③ 默认为十进制数 ④ printf函数的输出格式为%d或%i ⑤ 内存中以二进制存储
二进制
① 由0和1两个数字组成 ② 逢2进1 ③ 在数字开头加上0b或0B,表示二进制数 ④ 无法直接输出二进制数,需要进行转换
八进制
① 由0~7八个数字组成 ② 逢8进1 ③ 在数字开头加上0,表示八进制数 ④ printf函数的输出格式为%o
十六进制
① 由0~9,a~f(A~F)十六个字符组成 ② 逢16进1 ③ 在数字开头加上0x或0X,表示十六进制数 ④ printf函数的输出格式%x或%X
3> 进制之间的转换
二进制与十进制
① 二进制转化为十进制,是二进制数各个数位上得数字乘以2的该数 位所在的位数减1次幂,如:0b11 = 1x(2的1次幂)+ 1x(2 的0次幂) ② 十进制转化为二进制,先将该数转化为2的幂次累加的形式,系 数就为该十进制数的二进制形式,如11 = 1x(2的3次幂)+ 0x(2 的2次幂)+1x(2的1次幂)+1x(2的0次幂)
二进制与八进制
① 二进制转化为八进制数,先将二进制数从低位到高位,每三位分为 一组,每组转化为一位八进制数 ② 八进制转化为二进制数,将八进制数一位转化为三位二进制
二进制与十六进制
① 二进制转化为十六进制,先将二进制数从低位到高位,每四位分为 一组,每组转化为一位十六进制数
八进制、十六进制与十进制
① 八进制、十六进制与十进制之间的转化,一般要借助二进制,先 将八进制、十六进制或十进制转化为二进制,再进行转化
4> 类型说明符
long和short
① short修饰的数据占两个字节,short默认表示short int类型,一 般在进行操作之前,先转化为int类型,printf函数的输出格式为%d ② long修饰的数据占八个自己,long默认为long int类型,printf 函数的输出格式为%ld
signed 和unsigned
① unsigned修饰的数据只能表示整数非负整数 ② signed修饰的数据可以表示整数,默认为signed类型 ③ unsigned类型表示的非负整数个数时signed表示的二倍
5> n位2进制数的取值范围
signed修饰
signed修饰的n为二进制数的表示范围为(0~(2的n次幂-1))
unsigned修饰
unsigned修饰的n为二进制数的表示范围为((-2的n次幂)~ (2的n次幂-1))
6> 示例
#include <stdio.h> //定义一个函数将一个整数转化为二进制形式输出 void intToBinary(int number); int main() { //short unsigned定义的数据能表示最大的整数 //为2的16次幂-1即65535,此句会发出警告 short unsigned a = 65536; //定义int型变量,并将二进制数13赋值给该变量 int b = 0b1101; //定义int型变量,并将八进制数13赋值给该变量 int c = 015; printf("b=%o\n", c); //定义int型变量,并将十六进制数13赋值给该变量 int d = 0xd; printf("b=%x\n", c); //将一个整数转化为二进制形式输出 intToBinary(c); return 0; } //定义一个函数将一个整数转化为二进制形式输出 void intToBinary(int number) { //存储number在内存中所占的位数 int count; //存储每位二进制的数值 int bit; //计算number在内存中所占的位数 count = sizeof(number)*8; for (int i = count; i > 0; ) { i--; //通过右移和按位与运算计算number每个二进制位的数值 bit = number>>i & 1; printf("%d", bit); //每输出四个二进制位,输出一个制表符 if (0 == i % 4) { printf("\t"); } } }
二、位运算
1> 按位与(&)
全1才为1,否则为0
可以某个二进制位的值
2> 按位或(|)
全0才为0,否则为1
3> 按位异或(~)
相同为0,不同为1
某个数异或自己为0,异或0为自己
异或运算可以交换
异或可以用于交换两个变量的值
4> 按位取反(^)
0变为1,1变为0
按位取反连同符号位一块取反
5> 左移(<<)
低位补0,溢出位舍弃
符号位可能会被舍弃,正负性可能会改变
某个数左移n为等价于该数乘以2的n次幂
左移的效率比乘法高
6> 右移(>>)
负数右移,高位补1,溢出位舍弃
整数右移,高位补0,溢出位舍弃
某个数右移n为等价于该数除以2的n次幂
右移的效率比除法高
7> 示例(该示例使用代码块)
{ int a = 9; int b = 8; //记录移动的位数 int n; //记录中间变量的值 int temp; /* 用按位与运算判断一个整数的奇偶性, 比较运算符的左值和右值,如果是表达式,尽量用小括号括住 */ (a & 1) == 1 ? printf("a为奇数\n"):printf("a为偶数\n"); //按位或 temp = a | b; //用按位异或运算实现交换两个变量的值 a = a ^ b; b = a ^ b; a = a ^ b; //按位取反 temp = ~a; //用左移运算符实现乘以2的n次幂运算,这里乘以2的1次幂 n = 1; temp = a << n; //用左移运算符实现除以2的n次幂运算,这里除以2的2次幂 n = 2; temp = a >> n; }
三、char类型
1> 内存细节
占用一个字节大小的内存
在内存中以ASCII码(一个整数)形式存储
2> 使用注意
char类型可以存储一定范围的整形数据(0~127)
char类型可以进行自动类型提升整型,可以像操作整形数据一样操作char型数据
具有特殊含义的字符用printf函数输出时,要先转化为转义字符
将整数转化为字符,一般用这个整数加上'0',即为这个整数的字符形式
3> 示例
#include <stdio.h> #include <stdlib.h> //定义一个函数,将一个字符转化为对应的大小写形式 char upperOrLower(char c); int main() { //存储一个字符 char c; //存储字符转换后的形式 char temp; c = 'a'; //将一个字符转化为对应的大小写形式 temp = upperOrLower(c); } char upperOrLower(char c) { //若字符为小写形式,转换为大写形式 if (c >= 'a' && c <= 'z') { printf("该字符的小写形式为:%c\n", c - ('a' - 'A')); return c - ('a' - 'A'); } //若字符为大写形式,转换为小写形式 else if (c >= 'A' && c <= 'Z') { printf("该字符的小写形式为:%c\n", c + ('a' - 'A')); return c + ('a' - 'A'); } else { printf("输入有误,程序退出!\n"); exit(1); } }
相关文章推荐
- “()” “[]”问题
- 面试的算法2(C语言)(整理)
- C++11于once_flag,call_once分析的实现
- C语言-while(scanf...)...技巧 EOF含义
- 最大人品
- C++拷贝构造函数(二)
- C++拷贝构造函数
- C与C++在形参的一点小区别
- C++_引用与const
- 石子合并
- 普通背包问题
- 求最长不降子序列
- 医院病床分配仿真 举例(c语言)
- C++常见面试题
- leetcode 日经贴,Cpp code -Dungeon Game
- C++ 作用域
- C语言中的链接编写教程
- C++经典书籍
- C++中运算符 &和&&、|和|| 的区别
- C++中类型数据所占字节数