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;
}
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;
*/
}