---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
今天学习了内存剖析中。
一、内存剖析
1.类型说明符
#include <stdio.h>
/*
int 4个字节 %d
short 2个字节 %d
long 8个字节 %ld
long long 8个字节 %lld
signed 4个字节
unsiged 4个字节 无符号输出 %u
*/
int main(int argc, const char * argv[])
{
/*
signed和unsigned的区别:
signed 最高位要当做符号位
unsigned 最高位不要当做符号位
*/
// signed == signed int
// signed 有符号:正数、0、负数
signed int a = 10;
signed a2 = 10;
// unsigned int == unsigned;
// unsigned 无符号:0、正数
unsigned int b = 10;
unsigned b2 = 10;
long unsigned int c3 = 234123;
long unsigned c2 = 23345;
short unsigned int d = 12934;
short unsigned d2 = 3458023;
short signed int e = 346234;
short signed e2 = 3593;
// long == long int
// long int a = 194004574894379792343l;
// long a2 = 194004574894379792343l;
//long long int == long long
long long int c = 1940045748943ll;
// long long c2 = 1940045748943ll;
//short == short int
// short int d = 5454;
// short d2 = 43434;
printf("%lld\n",c);
int s = sizeof(short);
printf("%d\n",s);
return 0;
}
2.按位与、按位或、按位异或、按位取反
#include <stdio.h>
/*
一、按位与 &:只要对应的两个二进位均为1时,结果位才是1,否则为0
10110100
10100100
-----------
10100100
1001
0101
-----
0001
二、按位或 |:只要对应的二个二进位有一个为1时,结果就是1,否则为0
1001
0101
-----
1101
三、按位异或^:当对应的二进制相异(不相同)时,结果为1,否则为0.
1.相同数值进行异或,结果肯定是0,比如9^9 = 0
1001
1001
--------
0000
2.交换9^5^6 == 9^6^5
3.任何值跟0进行异或,结果还是原来的数值,9^0 == 9
1001
0000
------
1001
4.a^b^a == b
1001
0101
-----
1100
四、按位取反 ~
~0000 0000 0000 0000 0000 0000 0000 1001
1111 1111 1111 1111 1111 1111 1111 0110
*/
int main(int argc, const char * argv[])
{
printf("%d\n",9&5);
printf("%d\n",9|5);
printf("%d\n",~9);
printf("%d\n",9^5);
return 0;
}
3.左移、右移,及其用法
#include <stdio.h>
/*
一、左移 << 向左移动,符号位也消失,右边边空出的一位用0补充
0000 0000 0000 0000 0000 0000 0000 0000
00 0000 0000 0000 0000 0000 0000 100100
9<<1 -> 9 * 2的1次方 == 18
9<<2 -> 9 * 2的2次方 == 36
9<<n -> 9 * 2的n次方
以后要输入如 a * 2的n次方,直接将二进制左移n位,a<<n
右移 >> 向右移动,符号位不变,左边空出的一位用符号位补充
0000 0000 0000 0000 0000 0000 0000 0000
000000 0000 0000 0000 0000 0000 0000 10
8>>1 -> 8/2 == 4
8>>2 -> 8/2的2次方 ==2
8>>n -> 8/2的n次方
以后要输入如 a / 2的n次方,直接将二进制又移n位,a>>n
*/
int main(int argc, const char * argv[])
{
// insert code here...
printf("Hello, World!\n");
return 0;
}
4.练习:
1>用位与&运算符判断变量的奇偶性
//用位与&运算符判断变量的奇偶性
#include <stdio.h>
int main(int argc, const char * argv[])
{
int a = 15;
//方法一
if (a%2 == 1) {
printf("奇数\n",a%2);
}else{
printf("偶数\n",a%2);
}
//方法二
a%2?printf("奇数\n",a%2):printf("偶数\n",a%2);
//方法三
a%2==0?printf("偶数\n",a%2):printf("奇数\n",a%2);
//方法四
/*
15:1111
09:1001
14:1110
10:1010
*/
// a&1 == 1 //奇数
// a&1 == 0 //偶数
a&1?printf("奇数\n",a%2):printf("偶数\n",a%2);
return 0;
}
//两个变量值的互换
#include <stdio.h>
int main(int argc, const char * argv[])
{
int a = 10;
int b = 11;
// 方法一
int temp;
temp = a;
a = b;
b = temp;
//方法二
a = b - a;
b = b - a;
a = b + a;
//方法三
a = a ^ b; // a = 10^11
b = a ^ b; // b = 10^11^11 =10
a = a ^ b;
printf("a = %d , b = %d\n", a ,b);
return 0;
}
3>输出二进制位
#include <stdio.h>
/*
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1111
*/
void printBinary(int number);
int main(int argc, const char * argv[])
{
printBinary(9);
return 0;
}
void printBinary(int number)
{
//记录现在挪到第几位
//(sizeof(number)*8) - 1 == 31
int temp = (sizeof(number)<<3)-1;
while (temp>=0) {
int value = number>>temp & 1;
printf("%d",value);
temp--;
//每隔四个数字就空一格
if ((temp+1)%4==0) {
printf(" ");
}
}
printf("\n");
}
#include <stdio.h>
char upper(char c)
{
/*
//思路:如果是小写字母,准换为大写字母,如果是其他数值,返回它本身
方法一:
if (c>='a' && c<='z') { //确定范围大小
return c - 32; //在ASCII码表中,大小写字母相差32
}else{
return c;
}*/
//方法二:
if (c>='a' && c<='z') {
return c - 32;
}
return c;
}
int main(int argc, const char * argv[])
{
char cc = upper('f');
printf("%c\n",cc);
return 0;
}
5.内存存储细节-ASCII码表
#include <stdio.h>
int main(int argc, const char * argv[])
{
//ASCII码表中‘A’和‘a’之间的差距是32
//网上搜ASCII码表
//0000 0000 0000 0000 0000 0000 0000 1001
int a = 9;
//0100 0001
char c = 'A';
printf("%c\n",c);
printf("%d\n",'D');
char c2 = 'A' + 33;
printf("%c - %d\n",c2 ,c2);
/*
ASCII码值
A 65
B 66
C 67
*/
//
int num = 6;
//54 = 32 + 16 + 4 + 2;
//0011 0110
char c3 = '6';
printf("%d - %d\n",num , c3);
return 0;
}
6.char类型的使用注意事项
#include <stdio.h>
int main(int argc, const char * argv[])
{
//char 类型的错误写法
/*
一、单引号‘’只能括住单字节的字符
char c = '男';
*/
/*
二、双引号“”不能括单字符
char c = "A";
*/
/*
三、不能没有引号括住,
char c = A;
*/
// char c = 65;
// printf("%c\n",c);
/*
char c = 'A';
switch (c) {
case 'A':
printf("1\n");
break;
//这里不明白,上面的case‘A’执行完成之后应该整个break退出,怎么还会错误
// case 65:
// printf("2\n");
// break;
default:
printf("3\n");
break;
}
*/
//转义字符的使用
printf("\te\n");
printf("\\\n");
printf("\'\n");
printf("\"\n");
return 0;
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------