侧边栏壁纸

C语言学习笔记(一)

2018年08月22日 641阅读 0评论 0点赞

交换两个变量的值

  1. 使用中间变量

    int a = 10;
    int b = 20;
    int tmp = a;
    a = b;
    b = tmp;
  2. 两数相加再相减

    int a = 10,b = 20;
    a = a + b;
    b = a - b;
    a = a -b;
  3. 使用异或运算交换

    int a = 10,b = 20;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

生成1个随机数

  1. 引入标准库头文件stdlib.h
  2. 调用arc4random_uniform(int)函数
  3. 参数为一个整数,返回0至整数范围内(包含0,不包含整数自身)的随机数
  4. 如需产生指定范围的随机数,可用公式:arc4random_uniform(最大数-最小数+1)+最小数
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[]) {
    int ran = arc4random_uniform(100);
    int a = 50;
    int b = 205;
    int ran2 = arc4random_uniform(b - a + 1) + a;
}

进制转换

十进制转二进制

  • 除二取余法,将这个数除以2,直到商小于2,然后将最后的商与余数倒叙,就是这个十进制对应的二进制

二进制转十进制

  • 加权法:将二进制数的每个数码的位权相加,就是这个二进制对应的十进制数
  • 位权 = 数码 * (基数的数位次方)

十进制转八进制

  • 除八取余,将这个数除以8,直到商小于8,然后将最后的商与余数倒叙,就是这个十进制对应的八进制

八进制转十进制

  • 加权法:将八进制数的每个数码的位权相加,就是这个二进制对应的十进制数

二进制转八进制

  • 三合一法则,将这个二进制从低位到高位每三位分成1组,高位不够补0;将每1组转换为十进制;将每一组的十进制连起来

八进制转换为二进制

  • 一拆三,将八进制数每一个数码拆成三位的二进制数,并连起来

二进制转十六进制

  • 四合一法则,将这个二进制从低位到高位每四位分成1组,高位不够补0;将每1组转换为十六进制;将每一组的十六进制数连起来

十六进制转二进制

  • 一拆四,将十六进制数每一个数码拆成四位的二进制数,并连起来

八进制转十六进制

  • 将八进制转换为二进制再转换为十六进制

内存的构成

  1. 内存有一个个二进制位组成,每一个二进制位只能存储0或1
  2. 每八个二进制位分成一组,称为1个字节,字节是存储数据的最小基本单位
  3. 字节最多可以表示256种字符
  4. 内存的二进制位是固定的,声明变量实际是向系统在内存中申请一块指定字节数的连续字节空间
  5. 各类型变量所需的空间:
变量类型占用空间
int4byte
double8byte
float4byte
char1byte
  1. 单位换算:

    8bit(二进制位) = 1byte(字节)
    1024byte = 1KB
    1024KB = 1MB
    1024MB = 1GB
    1024GB = 1TB

int变量的修饰符

修饰符作用

指定int变量在内存中占用的字节

short修饰符

  • 在声明1个int变量时,可以使用short来修饰(int可省略)

    short num = 10;
    short int num = 20;
  • 被short修饰的int变量在内存中只占据2个字节,16位
  • 最高位为符号位,实际上表示数据的只有15位
  • 最小值:-32768;最大值:32767
  • 输出short值的占位符为:%hd

long修饰符

  • 在声明1个int变量时,可以使用long来修饰(int可省略)

    long (int) num = 10;
  • 被long修饰的int变量在32位的操作系统下占据4个字节;在64位的操作系统下占据8个字节
  • 输出long值的占位符为:%ld
  • long long修饰符

    • 与long相同,区别在于long long修饰符无论在32位还是64位都占据8个字节
    • 输出long long值的占位符为:%lld

unsigned修饰符

  • 使用该修饰符修饰int变量时,int类型的最高位不再用来表示符号位,而是来参与数据的表示
  • 这个时候就有32位用来表示数据,最大值翻了2倍,最小值为0;不存在负数
  • 输出unsigned值的占位符为:%u
  • 上方所讲修饰符均可以再加上该修饰符,来增加表示的数据位
  • 占位符

    unsigned int —> %u
    unsigned short —> %hu
    unsigned long —> %lu
    unsigned long long —> %llu

signed修饰符

  • 使用该修饰符时,int变量最高位表示符号位,其余为数据位
  • signed是int的默认修饰符,写不写都一样

原码、反码、补码

  1. 原码

    • 最高位表示符号位(0为正,1为负),剩下的位数,是这个数的绝对值的二进制
  2. 反码

    • 正数的反码就是其原码
    • 负数的反码就是在其原码的基础之上,符号位不变,其他位取反(0变1,1变0)
  3. 补码

    • 正数的补码就是其原码
    • 负数的补码就是在其反码的基础之上加上1

[scode color="lblue"]任何数据都是以其二进制的补码形式存储在内存中,因为计算机中只有加法没有减法,为了更加低成本的计算出结果,所以使用补码来存储数据[/scode]

例子

10

  • 10的原码:00000000 00000000 0000000 00001010
  • 10的反码:00000000 00000000 0000000 00001010
  • 10的补码:00000000 00000000 0000000 00001010

-8

  • -8的原码:10000000 00000000 00000000 00001000
  • -8的反码:11111111 11111111 11111111 11110111
  • -8的补码:11111111 11111111 11111111 11111000
0
打赏

—— 评论区 ——

博主关闭了当前页面的评论
博主栏壁纸
16 文章数
29 标签数
10 评论量
人生倒计时
舔狗日记