c语言深度剖析(2)—有符号与无符号
1. 数据类型
1.1 计算机中的符号位
- 有符号编码规则:数据的最高位用于标识数据的符号
- 最高位为1,表示这个数为负数
- 最高位为0,表示这个数为正数
- 无符号编码规则:数据的最高位不代表符号位
- 计算机不知道数据的正负,看人怎么看待
1.2 编程实验
- 有符号数的符号位
#include <stdio.h>int main()
{char c = -5;short s = 6;int i = -7;// 判断最高位是否是0,0表示正数,1表示负数printf("%d\n", ((c & 0x80) != 0)); // 1,按位与,结果非0为负数printf("%d\n", ((s & 0x8000) != 0)); // 0,为正数printf("%d\n", ((i & 0x80000000) != 0)); // 1,为负数system("pause");return 0;
}
2. 有符号数的表示法
- 在计算机内部用补码表示有符号数
- 正数的补码(原码,反码)为正数本身
- 负数的补码为负数的绝对值各位取反后加1
- 8位整数5的补码为: 0000 0101
- 8位整数-7的补码为:1111 1001
- 16位整数20的补码为:0000 0000 0001 0100
- 16位整数-13的补码为:1111 1111 1111 0011
3. 无符号数的表示法
- 在计算机内部用原码表示无符号数
- 无符号数默认为正数
- 无符号数没有符号位
- 对于固定长度的无符号数
- MAX_VALUE+1 MIN_VALUE
- MIN_VALUE-1MAX_VALUE
- signed和unsigned
- C语言中变量默认为有符号的类型
- 用unsigned关键字声明变量为无符号类型——只有整数类型能够声明为unsigned(浮点数不能声明为无符号数)
- int i; // 默认为有符号整数;
- signed int j; // 显式声明变量为有符号整数;
- unsigned int k ; // 声明为无符号整数
4.编程实验
- 当无符号数遇上有符号数时→有符号会被看作无符号数!
#include <stdio.h>
#include <stdlib.h>int main()
{unsigned int i = 5;int j = -10;if ((i + j) > 0) // j转换为无符号数,变成为大的正数(默认类型转换){printf("i+j>=0\n"); // 该结果为运行后最终的输出结果!}else{printf("i+j<=0\n");}system("pause");return 0;
}
- 错误地使用unsigned
#include <stdio.h>int main()
{unsigned int i = 0; // 无符号数永远为正数,即最小值为0// 当i减小到为0时,然后再减1就变成无符号int型数的最大值,// 以下代码会进入死循环,所以不应用无符号数来作为循环变量!for (i = 9; i >= 0; i--) // i为负数即退出循环,但i为无符号数,不可能为负数{printf("i=%u\n", i);}system("pause");return 0;
}
- 运行结果:
- 因为i永远大于等于0,MIN_VALUE-1 → MAX_VALUE
4. 小结
- 有符号数用补码表示
- 无符号数用原码表示
- unsigned只能修饰整数类型的变量
- 当无符号数与有符号数混合计算时,会将有符号数转换为无符号数后再进行计算,结果为无符号数。
c语言深度剖析(2)—有符号与无符号相关推荐
- C语言深度剖析书籍学习记录 第二章 符号
\ 连接符号,// \ 可以把下一行也注释调 编译器 删除注释时,会使用空格进行替代
- 国嵌c语言深度,国嵌C语言深度剖析班(第一期)-国嵌
国嵌C语言深度剖析班(第一期)共20个课程,包含源码及教程,主要讲了基本数据类型分析.auto,register,static分析.if,switch,do,while,for分析等,本教程提供1-5 ...
- C语言深度剖析笔记1
关键字的秘密 数据类型 什么是数据类型? 数据类型可以理解为固定内存大小的别名; 数据类型是创建变量的模子(花形的,圆形的,星形的等等); char 1byte short 2byte int 4by ...
- C语言深度剖析笔记2
接上半部分 C语言深度剖析笔记1 https://blog.csdn.net/halazi100/article/details/125844487 C语言深度剖析笔记1 指针 变量回顾 既然程序中的 ...
- c语言深度剖析百度云,《C语言深度剖析》笔记
<C语言深度剖析>笔记 1.在c语言中,凡不加返回值类型限定的函数,就会被编译器作为返 回整形处理. 2.register 变量必须是一个单个的值,并且其长度应小于或等于整型 的长度.而且 ...
- [学习笔记]C语言深度剖析
近期正在看<C语言深度剖析>,里面有一个讲解自加运算符(++),有一程序如下: void main() {int i;for(i=0, printf("First i = %d\ ...
- 【C语言进阶深度学习记录】二 有符号与无符号
今天学习C语言中的有符号与无符号 文章目录 1 计算机中的符号位 1.1 有符号数的表示法 1.2 无符号数的表示法 1.3 signed 和 unsigned 2 实验-当有符号数与无符号数进行运算 ...
- 读书笔记之《C语言深度剖析》第一章:关键字
第一章引言 什么是定义及声明? 定义:定义是编译器创建一个对象,并且为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名. 声明:1.告诉编译器该变量名已经匹配了一个内存 ...
- C语言——确定char、short、int和short变量有符号和无符号时的取值范围
C语言--确定char.short.int和short变量有符号和无符号时的取值范围 #include <stdio.h> #include <limits.h>// dete ...
- 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断...
开篇请各位猿友允许LZ啰嗦几句,最近一直在写计算机系统原理这系列文章,也已经下定决心要把这本书的内容写完.主要目的其实是为了巩固LZ的理解,另外也想把这些内容分享给猿友们,毕竟LZ觉得这些内容对程序猿 ...
最新文章
- 高德地图markevents_GitHub - mingxuWang/Map: 高德地图API二次封装
- sed和awk有什么区别? [关闭]
- vue +element 搭建项目,要求既支持pc端又支持移动端
- 吴恩达深度学习笔记4-Course1-Week4【深层神经网络】
- 数据库降级_阿里 双11 同款流控降级组件 Sentinel Go 正式GA,云原生服务稳稳稳...
- 关于Web报表FineReport打印的开发应用案例
- mysql索引结构原理、性能分析与优化
- Win7系统账户被禁用的解决方法
- 编程实现迷你计算器功能_VBA编程实现饲料配方计算器
- java中关于时间的格式化
- 转:标准C++中的string类的用法总结
- java 常用富文本编辑器_常用的六个富文本编辑器
- vs2017 脚本错误,当前页面的脚本发生错误
- Linux基础教程: 4、用户组和用户的创建
- html输入框位置控制,JS 控制input 输入框光标位置
- 记一次搜狐畅游后台开发笔试
- CG100具体功能介绍
- 基于安卓的掌上二手图书交易app
- 求求你,别在MySQL中使用UTF-8了!
- 基于Paddle复现《Neighbor2Neighbor: Self-Supervised Denoising from Single Noisy Images》降噪网络