———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
进制 什么是进制 是一种计数的方式,数值的表示形式 多种进制:十进制、二进制、八进制、十六进制。也就是说,同一个整数,我们至少有4种表示方式 变量的内存分析 研究变量在内存中的具体存储情况 字节和地址 为了更好地理解变量在内存中的存储细节,先要了解内存中的“字节”和“地址”。 内存以“字节为单位”,不同类型占用的字节是不一样的 变量的存储 所占用字节数跟类型有关,也跟编译器环境有关 内存由大到小寻址 只存储二进制形式 每个变量都有地址:第一个字节的地址就是变量的地址 查看内存地址的两种方式:%x和%p 输出格式: %c 输出字符 %p 输出地址 %f 输出小数 %o 八进制形式输出整数 %x 十六进制形式输出整数 默认情况下,就是十进制 int number =12; 八进制(0开头) int number3 = 014;十六进制(0x或者0X开头) int number4 = 0xc;
%d\%i 十进制形式输出整数
二进制(0b或者0B开头) int number2 = 0B1100; 变量在内存中就是二进制存储
进制转换:
1.二进制转十进制
0b1100 = 0 * 2的0次方 + 0 * 2的1次方 + 1 * 2的2次方+ 1 * 2的3次方
2.十进制转二进制
67 = 64 + 2 + 1 = 2的6次方 + 2的1次方 + 2的0次方
3.n位二进制的取值范围
2位二进制位的取值范围:0~3 0~2的2次方-1
3位二进制位的取值范围:0~7 0~2的3次方-1
n位二进制位的取值范围:0~2的n次方-1
类型说明符: int 4个字节 %d short 2个字节 %d long 8个字节 %ld long long 8个字节 %lld
signed和unsigned 1> 首先要明确的:signed int等价于signed,unsigned int等价于unsigned 2> signed和unsigned的区别就是它们的最高位是否要当做符号位,并不会像short和long那样改变数据的长度,即所占的字节数。 signed:表示有符号,也就是说最高位要当做符号位,所以包括正数、负数和0。其实int的最高位本来就是符号位,已经包括了正负数和0了,因此signed和int是一样的,signed等价于signed int,也等价于int。signed的取值范围是-231 ~ 231 - 1 unsigned:表示无符号,也就是说最高位并不当做符号位,所 以不包括负数。在64bit编译器环境下面,int占用4个字节(32bit),也就是0 ~ 232 - 1 signed unsigned %u
如:输出一个整数的二进制存储形式
<span style="color:#333333;">void printBinary(int number)
{
// 记录现在挪到第几位
// (sizeof(number)*8) - 1 == 31
int temp = ( sizeof(number)<<3 ) - 1;
while ( temp >= 0 )
{
// 先挪位,再&1,取出对应位的值
int value = (number>>temp) & 1;
printf("%d", value);
//
temp--;
// 每输出4位,就输出一个空格
if ( (temp + 1) % 4 == 0 )
{
printf(" ");
}
}</span>
位运算 & 按位与 功能 只有对应的两个二进位均为1时,结果位才为1,否则为0。 举例: 比如9&5,其实就是1001&101=1,因此9&5=1 规律 二进制中,与1相&就保持原位,与0相&就为0 | 按位或 功能 只要对应的二个二进位有一个为1时,结果位就为1,否则为0。 举例: 比如9|5,其实就是1001|101=1101,因此9|5=13 ^ 按位异或1.当对应的二进位相异(不相同)时,结果为1,否则为0。 2.交换 9^5^6 == 9^6^5 3.任何数值跟0进行异或,结果还是原来的数值,9^0 == 9 4.a^b^a == a^a^b == 0^b == b~ 取反对整数a的各二进位进行取反,符号位也取反(0变1,1变0)<< 左移把整数a的各二进位全部左移n位,高位丢弃,低位补0。左移n位其实就是乘以2的n次方由于左移是丢弃最高位,0补最低位,所以符号位也会被丢弃,左移出来的结果值可能会改变正负性>> 右移把整数a的各二进位全部右移n位,保持符号位不变。右移n位其实就是除以2的n次方为正数时, 符号位为0,最高位补0为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定
使用位异或运算符交换两个变量的值 不使用第三方变量: a = b - a; b = b - a; a = b + a; 用位异或来交换: a = a ^ b; b = a ^ b; a = a ^ b;
用位与&运算符判断变量的奇偶性 a&1 ==1// 奇数 a&1 ==0// 偶数
负数在内存中的存储 一个字节的取值范围 负数的表示形式 原码、反码、补码
char类型
存储细节
ASCII单字节表(双字节GBK\GB2312\GB18030\Unicode)
ASCII码表 字符 ASCII码值 A 65 B 66 C 67
当做整型使用
在-128~127范围内,可以当做整数来用
%c和%d\%i的使用
printf(“%d”, ‘A’);
printf(“%c”, 68);
注意: 单引号''只能扩住单字节的字符 char c = '男'; //错误写法 char c = "A";// 错误写法 char c = A; // 错误写法 char c = 65; 另外,switch语句case中不能有相同值,下面写法也是不对的:
<span style="color:#333333;">char c = 'A';
switch (c) {
case 'A':
printf("1\n");
break;
case 65:
printf("2\n");
break;
default:
printf("3\n");
break;
}*/</span>