黑马程序员---C语言之进制与内存剖析

这篇博客主要探讨了C语言中的进制转换,包括二进制转十进制和十进制转二进制的详细过程,并阐述了n位二进制的取值范围,例如2位和3位二进制的取值范围。此外,还提及了如何输出整数的二进制存储形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

———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 * 20次方 + 0 * 21次方 + 1 * 22次方+ 1 * 23次方 
2.十进制转二进制
 67 = 64 + 2 + 1 = 26次方 + 21次方 + 20次方
3.n位二进制的取值范围
 2位二进制位的取值范围:0~3  0~22次方-1
 3位二进制位的取值范围:0~7  0~23次方-1
 n位二进制位的取值范围:0~2n次方-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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值