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\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) 原码反码补码与数据类型的更多相关文章
- C语言基础(4)-原码,反码,补码及sizeof关键字
1. 原码 +7的原码是0000 0111 -7的原码是1000 0111 +0的原码是0000 0000 -0的原码是1000 0000 2. 反码 一个数如果值为正,那么反码和原码相同. 一个数如 ...
- java基础知识-原码,反码,补码
1.正数:原码,反码,补码:都一样. 2.负数:和正数的储存方式不同,负数都是以补码形式存储的. <1>负数的补码 把负数的原码除了符号位取反后再+1. <2>负数的原码 把对 ...
- C语言原码反码补码与位运算.
目录: 一.机器数和真值 二.原码,反码和补码的基础概念 三.为什么要使用原码,反码和补码 四.原码,补码,反码再深入 五.数据溢出测试 六.位运算 ...
- Java基础-原码反码补码
Java基础-原码反码补码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 注意,我们这里举列的原码和反码只是为了求负数的补码,在计算机中没有原码,反码的存在,只有补码. 一.原码 ...
- 「C语言」原码反码补码与位运算
尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解. 本篇文章便是在结合百度百科有关原码.反码.补码和位运算的介绍并深度借鉴了张子秋和Liquor相关文章后整理而出. 目录 ...
- C语言学习笔记之原码反码补码
原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0 0变1 补码:机器 ...
- 原码 & 反码 & 补码 & 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- Java 原码 反码 补码
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 位移&二进制转换&原码&反码&补码
<< 左移 按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零. 格式 需要移位的数字 << 移位的次数 计算过程 1. 按二进制形式把所有的数字向左 ...
随机推荐
- 网站出现502 bad getway
最近项目之余,领导叫解决下系统网站经常出现502的问题,作为小头头的我,怎能不顶上. 流程开始走起,先查nginx,嗯,配置是大众的.是不是缓存溢出了呢.调节buffer的值 .貌似也没什么影响啊.5 ...
- kali2018.2安装配置OpenVAS-9及错误处置
1 配置环境 1)虚拟机环境:VMware® Workstation 14 Pro(版本号:14.1.2 build-8497320),如图1. 图1 虚拟机版本信息 2)kali镜像 Kali201 ...
- Python笔记6----数组
1.Python 中的数组 形式: 用list和tuple等数据结构表示数组 一维数组:list=[1,2,3,4] 二维数组:list=[[1,2,3],[4,5,6],[7,8,9]] 用arra ...
- Python数据分析5-----数据规约
1.数据规约概念和目的 数据规约是产生更小且保留数据完整性的新数据集. 意义:降低无效错误数据的影响.更有效率.降低存储成本. 2.属性规约 (1)属性合并(降维):比如PCA (2)删除不相关属性 ...
- 【codeforces 723E】One-Way Reform
[题目链接]:http://codeforces.com/contest/723/problem/E [题意] 给你一个无向图; 让你把这m条边改成有向图; 然后使得出度数目等于入度数目的点的数目最多 ...
- Ubuntu 15.10配置OpenCV
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50635705 1 安装前准备 安装以下 ...
- 公司组织oracle培训的理解
oracle执行机制 1.客户端发送一条sql给oracle服务器,oracle会看这条sql的执行计划是否存在缓存 如果存在则直接运行,如果不存在执行第二步. 2.如果不存在缓存 则会 进行语法检 ...
- [SharePoint2010开发入门经典]创建你的第一个SPS2010程序
本章概要: 1.创建一个解决方案,使他能读写数据从列表中,使用服务器端对象模型和可视的web部件 2.使用VS2010构建部署解决方案 3.使用图标web部件渲染列表数据 4.在一个解决方案中集成不同 ...
- Android仿IOS的AssistiveTouch的控件EasyTouch实现
概述: 之前我听到过一则新闻,就是说Ipone中的AssistiveTouch的设计初衷是给残疾人使用的. 而这一功能在亚洲(中国)的使用最为频繁. 虽不知道这新闻的可靠性,但无庸置疑的是它的确给我们 ...
- Nginx 做系统的前端反向proxy
Nginx是一款很优秀的基于event的webserver.吞吐量大.占用资源少,只是文档就很让人郁闷了,免费的Nginx和收费的Nginx+的文档共用一份,配置完之后才发现免费的Nginx启动某些命 ...