zoukankan      html  css  js  c++  java
  • C语言基础 (4) 原码反码补码与数据类型

    1.回顾

    使用gcc编译代码

    gcc hello.c -o hello

    windows下编译代码

    C语言编译步骤:

    预处理(头文件展开,干掉注释) gcc -E hello.c -o hello.i

    编译 (生成汇编代码) gcc -S hello.i -o hello.s

    汇编 (生成目标代码) gcc -C hello.s -o hello.o

    链接 gcc hello.o -o hello_elf

    2.1常量和变量

    数据结构——研究数据怎么存

    算法——研究数据怎么运算

    数据怎么存呢?

    内存有空间有大小,为了更好的存做了分类,就是数据类型 int,char…等等

    数据类型的作用:告诉编译器定义这么一个类型的变量需要分类多大的空间

    3.变量补充

    extern关键字: 声明一个变量,声明变量没有建立存储空间(暂时了解,后面再学习)

    extern int d

    d = 11 //因为d没有定义 没有定义就没有空间 没有空间就不能赋值

    4 常用和变量定义代码

    // 1 #开头的语句是预处理语句,无需分号结束

    // 2 定义一个宏定义的标识符MAX,它代表100,MAX它是常量

    #define MAX 100

    int main(int argc,char *argv[])

    {

      MAX =1  // 报错

    }

    const是一个关键字 作用是修饰一个变量为只读

    5 二进制 八进制 十六进制

    6 十进制转二进制

    结论:数据是以补码形式存储在计算机中的。

    十进制与二进制的转换

    十进制转换二进制

    二进制转换十进制

    07 二进制 八进制 十六进制相互转换

    二进制和八进制相互转换(八进制1位对于二进制3位)

    三位二进制转换一位八进制

    010 111 101 010 101 010 010 101

    2       7    5     2      5     2     2     5 (根据8421转换:这个已经是八进制了)

    二进制和十六进制相互转换(十六进制的1位对应二进制4位)

    0101 1110 1010 1010 1001 0101

      5      e(14)    a       a      9      5

    八进制和十六进制相互转换(先转换成二进制 再转)

    C语言如何表示相应进制数

    printf(‘%d ’,a)

    printf(‘%o ’,a)

    printf(‘%x ’,a)

    c语言不能直接书写二进制数

    10 计算机为什么使用补码存储数据

    1) 存储1字节(8位)大小的数字(char)

    原码(用户角度):原始的二进制

    用户的数字分为正负数,符号位的存储‘

    2) 最高位为符号位: 0代表为正数,1代表为负数

    3) 1000 00001 左边是高位 右边是低位

    1, +1: 0000 0001

    -1: 1000 0001

      +0: 0000 0000

      -0: 1000 0000

    原码存储导致两个问题:

    1、0有2种存储方式

    2、正数和负数相加 结果不正确(计算机只会加 不会减)

    以原码来算:

    1-1 = 1+ -1

    1:0000 0001

    -1:1000 0001

      1000 0010 = -2

    # 如果用原码来表示 1-1 = -2!!!

    反码(为了算补码)

    1、正数的原码和反码一样,负数反码是在原码基础上,符号位不变,其他位取反

    1,+1: 0000 0001

       -1:1111 1110

       +0:0111 1111

       -0:1111 1111

    反码解决了刚才相加1+-1为-2的问题

    反码存储导致1个问题0有两种存储方式 +0和-0

    计算机存储数字以补码方式存储(为了解决负数的存储)

    补码:

    1、正数的原码、反码、补码都一样

    2、负数是反码+1

    1、+1: 0000 0001

       -1: 1111 111

       +0: 0000 0000

       -0: 10000 0000(最高位丢弃) = 0000 0000

    10进制数,站在用户的角度,原码

    二进制、八进制、十六进制, 站在计算机角度,补码

    12 补码验证 

    //二进制、八进制、十六进制,变量赋值其实是站在计算机角度,补码

    char a = 0x81   <- 这里是补码

    补码:1000 0001

    反码:1000 0000

    原码:1111 1110

    原码求补码:

    *如果是负数的话:

    1.符号位不变,其他位取反

    2.在1的基础上+1

    补码求原码

    *如果是负数的话:

    1.符号位不变,其他位取反

    2.在1的基础上加1

    *如果是正数的话,就是原码

    14 有符号和无符号的区别

    1) 有符号 最高位是符号位 如果是1代表为负数 如果为0 代表为正数

    printf(‘%d ’,0x…)

    printf(‘%u ’,0x…)

    %u指无符号数 最高位是数的一部分 不可能为负数

    15 char范围计算

    char 1个字节

    有符号的范围

    正数:

    0000 0000 ~ 0111 1111

    0           127

    负数:

    1000 0000 ~ 1111 111

    -0 ~ -127

    -0 当做 -128使用

    -128:

    原码 1 1000 0000 ( 注: 1000 000 是128的二进制数 , 前面加一个1 作为符号位 这就是-128 )

    反码 1 0111 1111

    补码 1 1000 0000

    // 发现原码和补码是一样的,很特殊 于是计算机就将-0作为-128进行处理

    无符号范围:

    0000 0000 ~ 1111 1111

    0~ 255

    char:

    有符号: -128~127

    无符号:0~255

    赋值或者运算 记得不要越界

    char ch = 127+2

    解析:越界了结果为-127

    18 sizeof

    计算一个数字类型大小,单位是字节

    // 数据类型的作用:告诉编译器 定义此类型变量需要多大空间

    19 整型变量输入输出

    int a

    printf(‘请输入 a:”)

    //阻塞,等待用户输入内容,按回车结束

    scanf(‘%d’,&a)

    printf(“a= %d ”,a)

    // short 占2字节

    short int b

    printf(‘请输入b:’)

    scanf(‘%hd’,&b)

    printf(“b=%hd ’,b)

    long int

     

    20 整型的使用总结

    21 字符的基本使用

    // 1 内存中没有字符 只有数字

    // 2 一个数字对应一个字符 这种规则就是ascii

    // 3 使用字符或数字给字符变量赋值是等价的

    // 4 字符类型本质上就是一个字节大小的整形

    man ascii 查看这个手册

    // 字符:’一个字符’

    char ch = ‘a’

    printf(‘ch1 = %c , ch = %d ’,ch,ch)  // a 97

    ch = 97 // 以ascii赋值,和 ch = ‘a’是等价的

    printf(“ch2 = %c ”,ch) // a

    // 小写字母比大写字母大32

     char a = “A”

    char b = ‘a’

    printf(“A=%d,a=%d ”,a,b)

    // 小写转大写 小写字母减32

    printf(“小写转大写:%c ”,’a’-32);

    // 大写转小写 大写字母+32

    printf(“大写转小写:%c ”,’A’+32)

    char tmp

    printf(“请输入字符:”)

    scanf(“%c”,&tmp)

    printf(“tmp = %c ”,tmp)

    22 转义字符

    // 字符 原则上’’ 内部只有一个字符 转义字符除外

    char a = ‘abc’ //不合理 会出现警告

    // 转义字符,由反斜杠组成的多个字符

    char ch = ‘ ’ //换行符

    printf(‘fff%c’,ch)

    ch = ‘ ’ // 回到句首

    printf(“fff%cefg ”,ch)

    ch = ‘’ // 退格

    printf(“12%c3456 ”,ch)

    打印到句首然后覆盖

    23 浮点型的使用

    24 类型限定符

    为什么会有防止编译器优化这个东西?

    如上图,比如是控制跑马灯亮的一个功能,1,2,3,4对应四个灯,需要一个一个亮,如果被优化了就会直接切到4.

  • 相关阅读:
    python笔记-13 mysql与sqlalchemy
    python笔记-12 redis缓存
    python笔记-11 rabbitmq
    python笔记-10(socket提升、paramiko、线程、进程、协程、同步IO、异步IO)
    python笔记-9(subprocess模块、面向对象、socket入门)
    python笔记-7(shutil/json/pickle/shelve/xml/configparser/hashlib模块)
    leetcode98
    leetcode543
    leetcode85
    leetcode84
  • 原文地址:https://www.cnblogs.com/eret9616/p/9961321.html
Copyright © 2011-2022 走看看