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\n’,a)

printf(‘%o\n’,a)

printf(‘%x\n’,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\n’,0x…)

printf(‘%u\n’,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\n”,a)

// short 占2字节

short int b

printf(‘请输入b:’)

scanf(‘%hd’,&b)

printf(“b=%hd\n’,b)

long int

20 整型的使用总结

21 字符的基本使用

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

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

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

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

man ascii 查看这个手册

// 字符:’一个字符’

char ch = ‘a’

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

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

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

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

char a = “A”

char b = ‘a’

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

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

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

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

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

char tmp

printf(“请输入字符:”)

scanf(“%c”,&tmp)

printf(“tmp = %c\n”,tmp)

22 转义字符

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

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

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

char ch = ‘\n’ //换行符

printf(‘fff%c’,ch)

ch = ‘\r’ // 回到句首

printf(“fff%cefg\n”,ch)

ch = ‘\b’ // 退格

printf(“12%c3456\n”,ch)

打印到句首然后覆盖

23 浮点型的使用

24 类型限定符

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

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

C语言基础 (4) 原码反码补码与数据类型的更多相关文章

  1. C语言基础(4)-原码,反码,补码及sizeof关键字

    1. 原码 +7的原码是0000 0111 -7的原码是1000 0111 +0的原码是0000 0000 -0的原码是1000 0000 2. 反码 一个数如果值为正,那么反码和原码相同. 一个数如 ...

  2. java基础知识-原码,反码,补码

    1.正数:原码,反码,补码:都一样. 2.负数:和正数的储存方式不同,负数都是以补码形式存储的. <1>负数的补码 把负数的原码除了符号位取反后再+1. <2>负数的原码 把对 ...

  3. C语言原码反码补码与位运算.

      目录:     一.机器数和真值     二.原码,反码和补码的基础概念     三.为什么要使用原码,反码和补码     四.原码,补码,反码再深入     五.数据溢出测试     六.位运算 ...

  4. Java基础-原码反码补码

    Java基础-原码反码补码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 注意,我们这里举列的原码和反码只是为了求负数的补码,在计算机中没有原码,反码的存在,只有补码. 一.原码 ...

  5. 「C语言」原码反码补码与位运算

    尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解.     本篇文章便是在结合百度百科有关原码.反码.补码和位运算的介绍并深度借鉴了张子秋和Liquor相关文章后整理而出.   目录 ...

  6. C语言学习笔记之原码反码补码

    原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0   0变1 补码:机器 ...

  7. 原码 & 反码 & 补码 & 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  8. Java 原码 反码 补码

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  9. 位移&二进制转换&原码&反码&补码

    << 左移 按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零. 格式 需要移位的数字 << 移位的次数 计算过程 1. 按二进制形式把所有的数字向左 ...

随机推荐

  1. P1422 小玉家的电费

    ... 题目描述 夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了.小玉家今天收到了一份电费通知单.小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千 ...

  2. fun(int **p)的使用

    #include <iostream>using namespace std;void fun(int **p){ cout << p[0][0] << endl; ...

  3. FCN图像分割

    一. 图像语义分割 传统的图像分割方法主要包括以下几种: 1)基于边缘检测 2)基于阈值分割 比如直方图,颜色,灰度等 3)水平集方法 这里我们要说的是语义分割,什么是语义分割呢?先来看张图: 将目标 ...

  4. MAVEN项目的搭建

    MAVEN能为我们做什么? 1.Jar的声明式依赖性管理 2.项目的自动构建 搭建流程 环境配置 http://maven.apache.org/download.html 下载最新版本Maven 3 ...

  5. soapui测试接口使用步骤

    1.新建项目 2. 定义接口 url输入接口 3.新建测试集 选择项目,右键 4.在测试集下新建测试用例 5.在测试步骤中导入要测试的请求 6.run

  6. [SharePoint2010开发入门经典]12、SPS2010安全管理

    本章概要: 1.SPS中的用户授权 2.理解服务器场解决方案和沙箱解决方案的不同 3.理解表单验证和声明验证

  7. hive join 优化 --小表join大表

    1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高.hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配.从而省去red ...

  8. hdu5319 Painter(模拟)

    题目链接:点击打开链接 题目大意:给一个矩形.有两把刷子,一把刷红色,一把刷蓝色,红色的方向是东南,蓝色的方向是西北,红色加蓝色等于绿色,如今已知这面墙当前的状态.求从白墙到这个状态最少刷了多少次. ...

  9. Jmeter简单应用

    JMeter 是Apache组织的开源项目,是一个纯Java桌面应用,用于压力测试和性能测量. 1.安装jmeter jdk1.6以上下载地址:http://www.oracle.com/techne ...

  10. 2015 Multi-University Training Contest 2 1006 Friends 壮压

    题目链接 题意:t 组測试数据,每组測试数据有 n个人,m条关系 每条关系能够是 "线上关系" 或者 "线下关系". 要求每一个人的线上关系(条数) == 线下 ...