您的位置:首页 > 编程语言 > C语言/C++

黑马程序员_iOS开发C语言基础之二进制内存存储解析与字符操作

2014-09-28 23:06 393 查看

1、内存中变量的二进制存储

#include <stdio.h>
int main()
{

// 一个int类型数据占据4个字节、32bit

// 0000 0000 0000 0000 0000 0000 0000 1100

// 内存分配地址由大到小,放数据也是由大到小

// 变量的首地址是地址中最小值
int number = 12; // 1100
int number2 = 13; // 1101
printf("%p\n",&number);
printf("%p\n",&number2);
return 0;
}





.089 == 0.089
十六进制字母大小写都行
96f是错误的,f前只能放小数。
15.4e6 表示15.4*10的6次方 e后要是整数

2 、正负数在内存中的存储形式

#include <stdio.h>
int main()
{
void putBinary(int);
putBinary(12);
putBinary(-12);
putBinary(13);
return 0;
}

// 输出一个整数的二进制存储形式
void putBinary(int n )
{
int bits = sizeof(n)*8;
while (bits-->0)
{
printf("%d", n>>bits&1);
if (bits%4==0) printf("
");
}
printf("\n");
}



int long long long 所占的字节数和多少位数的编译器有关,可以用sizeof验证
int s = sizeof(int); long long c1 = 123434ll; long int c2 = 12l;
long unsigned int = long unsigned %u

3、位运算符注意事项

/* 按位与 &

1001

0101

-----

0001

*/

/*int a = 9 & 5;

printf("%d\n",a );

return 0;*/

/*

按位异或 ^ (搜狗中文环境下符号“……”使用shift+6)

异或可以交换 2^3^4 = 4^2^3

与0异或,数值不变 与1异或,相当于把数值按位取反

9^5^9 = 9^9^5=5 a^b^a == 0^b == b

*/
/*

按位取反 ~

~0000 0000 0000 0000 0000 0000 0000 1001

1111 1111 1111 1111 1111 1111 1111 0110

-10

按位取反连同符号位也会被取反

*/
/*

左移 <<

很可能把符号位改变

*/
/*

右移 >>

最高位用符号位补充

*/

4、利用两种方式实现两个变量值的交换

// 实现两个变量值交换
int a = 10;
int b = 11;

// 利用算术运算
/*

a=b-a; // a --> 11-10

b=b-a; // b --> 11-(11-10) -->10

a=b+a; // a --> 10 + 11 -10 -->11

*/

// 利用按位异或^运算
a = a^b; // a --> 10^11

b = a^b; // b --> 10^11^11 -->10

a = a^b; // a -->10^11^10 -->11

printf("a=%d,b=%d\n",a ,b);

5、利用位运算判断一个数的奇偶性

// 利用按位&运算符判断奇偶性 奇偶数的最后一位为0,表示偶数,为1时是奇数;与0b1进行按位与&
int c = 11;

c & 0b1 ? printf("奇数\n")
: printf("偶数\n”);

6、编写一个函数,输出其在内存中的二进制形式

// 编写一个函数,输出整数在内存中的二进制形式
int d = 9;
void printBinary(int number);
printBinary(d);
return 0;
}

void printBinary(int number)
{
int temp = (sizeof(number)<<3) -1;
for(int i=temp;i>=0;i--)
{
int m = (number >> i)& 0b1;
printf("%d",m );
if(i%4==0)printf("
");
}
printf("\n");

}

7、字符操作注意事项

#include <stdio.h>

int main()
{
int a = 9;

// 字符‘A’在内存中存放的ASCII码值65(十进制)的二进制0100
0001形式
char c = 'A';
printf("%d\n",c );
printf("%c\n",65);
printf("%d\n",'A');

char c2 = 'A'+33; //
98 'b'
printf("%c - %d \n",c2 ,c2);

int num = 6; // 0000 0110

char c3 ='6'; // 54d = 32+16+4+2 0011 0110
printf("%d - %d\n",num ,c3);
/*

ASCII码表

字符 ASCII码值

A 65

B 66

*/

//char c = '男'; // 错

//char c ="A"; // 错

//char c = A; // 错

//char c =65; // 对
char c4 = 'A';

// 以下编译通不过,因为'A'就是65
switch(c) {

case 'A' :
printf("1\n");
break;
case 65:
printf("2\n");
break;
}

printf("%d\n",'\n'); // '\n'的ASCII码值为10
printf("\\ \" \t"); // 输出"\" """
printf("%d\n",'a'-'A'); //
a与A的差为固定值32
return 0;

}

char upper(char c )
{

//如果是小写字母,就转换成大写字母
if(c>'a'&& c<'z')
{
return c - ('a'-'A');
}
else
{
return c ;
}

//差不多的写法
/*

if(c>'a'&&c<'z')

return c-('a'-'A');

return c;

*/
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: