今天学习C语言中的有符号与无符号

文章目录

  • 1 计算机中的符号位
    • 1.1 有符号数的表示法
    • 1.2 无符号数的表示法
    • 1.3 signed 和 unsigned
  • 2 实验-当有符号数与无符号数进行运算
  • 3 错误的使用了unsigned
  • 4 总结

1 计算机中的符号位

C语言中,数据类型的最高位,用于标识数据的符号。

  • 最高位为1,表明这个数为负数
  • 最高位为0,表明这个数为正数

比如下图:

1.1 有符号数的表示法

  • 在计算机内部用补码表示负数
  1. 正数的补码为正数本身
  2. 负数的补码为负数的绝对值各位取反后加1

比如下图中的:

1.2 无符号数的表示法

  • 在计算机内部,用源码表示无符号数。
  1. 无符号数默认为正数
  2. 无符号数没有符号位
  • 对于固定长度的无符号数有:
  1. MAX_VALUE +1 --> MIN_VALUE
  2. MIN_VALUE - 1 --> MAX_VALUE

1.3 signed 和 unsigned

  • 在C语言中,变量默认为有符号的类型
  • unsigned 关键字声明变量为无符号类型

但是要注意一点,只有整数类型(int,char,long,short)能够声明unsigned变量

2 实验-当有符号数与无符号数进行运算

如下程序的运行代码:

#include <stdio.h>int main()
{unsigned int i = 5;
int j = -10;if( (i + j) > 0 )
{printf("i + j > 0\n");
}
else
{printf("i + j <= 0\n");
}return 0;
}

运行结果将是i+j >0 。

  • 因为有符号数与无符号数进行混合运算时,会将有符号数转换成无符号数后再进行计算,计算结果就变成了无符号数了。所以上述结果为正数

3 错误的使用了unsigned

当错误的使用了下面的方式来写代码的时候,会产生错误:

#include <stdio.h>int main()
{unsigned int i = 0;for(i=9; i>=0; i--){printf("i = %u\n", i);}return 0;
}

上述程序的运行结果为无限循环打印。

  • 因为变量i是无符号数,所以i肯定大于等于0,上述的for循环会一直循环下去。

4 总结

  • 有符号数用补码表示
  1. 正数的符号位为0
  2. 负数的符号位为1
  • 无符号数用源码表示
  1. 无符号数没有符号位
  2. 无符号数只能用于表示正数以及0
  • unsigned 只能用于修饰正数类型的变量
  • 有符号数与无符号数进行混合运算时,会将有符号数转换成无符号数后再进行计算,计算结果就变成了无符号数了

【C语言进阶深度学习记录】二 有符号与无符号相关推荐

  1. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  2. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  3. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  4. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  5. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  6. 【C语言进阶深度学习记录】八 C语言中void的分析

    文章目录 1 void的意义 1.1 不存在void变量 1.2 C标准 1.3 void指针的意义 1.4 通过void* 实现memset函数 2 总结 1 void的意义 void修饰函数的参数 ...

  7. 【C语言进阶深度学习记录】五 C语言中变量的属性

    上一篇文章学习了C语言中的类型转换,点击链接查看:[C语言进阶深度学习记录]四 C语言中的类型转换. 文章目录 1 C语言的变量属性 1.1 auto关键字 1.2 register关键字 1.3 s ...

  8. 【C语言进阶深度学习记录】三 浮点数(float) 在内存中的表示方法

    相信大多数人知道整形数在内存中的分布方式,而且也能很容易写出其二进制的形式,但是对于浮点数,估计知道的人并不是很多 今天学习在C语言中浮点数在内存中的表示方法 文章目录 1 浮点数在内存中的存储方式 ...

  9. 【C语言进阶深度学习记录】十七 宏定义的使用与分析

    文章目录 1 C语言中的宏定义 1.1 定义宏常量 1.2 宏定义表达式 1.3 宏表达式与函数的对比 1.4 宏表达式的作用域 2 C语言中的内置宏 3 宏定义的代码综合示例 4 总结 1 C语言中 ...

最新文章

  1. 纯CSS实现蓝色圆角下拉菜单
  2. Dinic最大流 || Luogu P3376 【模板】网络最大流
  3. zabbix学习小结
  4. LINQ 的查询执行何时是延迟执行,何时是立即执行,以及查询的复用
  5. Codeforce1311B. WeirdSort (冒泡排序)
  6. 【剑指offer】_13 圆圈中最后的数
  7. Python面试题总结(8)--操作类
  8. innobackupex备份工具
  9. JS面向对象——Object对象的方法补充、原型继承关系图
  10. 收集数据至泛型Dictionary
  11. 7个示例科普CPU Cache(转)
  12. Cookie和Session的知识
  13. js省市二级联动;)
  14. 力扣每日一刷-两数之和(暴力、双指针)
  15. 无人机模拟操控凤凰模拟器(PhoenixRC 5.0)安装及配置图文教程(附凤凰模拟器下载地址)
  16. matlab latex表示,科学网—MATLAB程序如何在latex上发表? - 卢远志的博文
  17. 微信扫码支付 java版
  18. 笔记本无线上网卡的种类
  19. 腾达ap设置说明_腾达(Tenda)F9无线路由器AP模式怎么设置[教程]?【图解】
  20. 答题微信小程序实现(7):python3将题库处理成json格式的。

热门文章

  1. html:(13):ol-li和div作用
  2. hadoop简介(大数据技术)
  3. vue项目结构(未抽离成.vue文件前的结构)
  4. Python基础入门_5面向对象基础
  5. 如果你还不了解GBDT,不妨看看这篇文章
  6. msf生成php,使用msfpayload生成后门(asp,aspx,php,jsp,exe)等
  7. Django-视图层
  8. SQLServer之事务简介
  9. 启动activity的标准的action常量及对应的字符串
  10. 一段比较好的加1操作。能够防止简单的++造成的溢出。