#include<stdio.h>
void main()
{int l=-1;unsigned int c=135;
printf("%u\n",l+c);
}

这个的结果134,而不是我之前认为的很大的正数,实际上需要注意的是-1(0xffffffff)被提升为unsigned int后是一个差1就溢出的unsigned int,所以相加后结果是134。但是如果l=-10000,那么结果就真是一个很大的正数了,因为不涉及溢出了。
C语言中存在两种整数算术运算,有符号型和无符号型。无符号数运算:所有无符号数运算都是以2的n次方为模,(n是结果中的位数)。所以它不存在运算时的没有那种所谓的“溢出”,当它超过范围时,从零开始重新计数!当一个无符号数和有符号数计算的时候,有符号数会自动转化为无符号数参与运算!有符号数运算: 是可能发生“溢出”的,而且“溢出”的结果不固定。

关于无符号数减去无符号数的用法错误:

if ( i - j >=0) 假如i,j为无符号数,这样写可能会引发错误,即当i小于j的时候,这个式子仍然成立,因为无符号数始终是大于等于零的。例: if ( strlen( a ) >= 10) 与 if (strlen ( b ) -10 >= 0) 这两条语句是不相等的 ,因为strlen函数返回的是无符号数类型。

2015年3月8日追加一点:今天看这个地方有些不明白在网上搜了一下资料发现,无符号数相减,如果被减数小于减数,那么结果会是一个非常大的无符号数,而不是一个想象中的有符号数。所以对于无符号数相减之前需要进行判断,最好做比较的时候使用 if ( strlen( a ) >= 10) 这种方式,而不要使用if (strlen ( b ) -10 >= 0) 这种方式。因为无符号数进行计算的结果还是无符号数;另外无符号数和有符号数计算时,有符号数会被强制转提升无符号数。

例如以下这个例子很有意思:

#include<stdio.h>
int main()
{
unsigned int a=6;
int b=-20;
printf("%d\n",(a+b)>0); } 

这个小例子可以机器试一下。另外还有几道题不错我也附在最后。

需要注意一点,我在进行程序编写的时候发现一个小问题:

那么unsigned char与signed int相减呢?

#include<stdio.h>
void main()
{unsigned char a;int b;a=0;b=2;printf("X=%d\n",(a-b)>0);
}

ANSI C规定在无符号整数和有符号整数之间进行强制类型转换时,位模式不应该改变。类型转换并未改变对象的位模式,改变的是位模式的解释方式。

有符号数转换为无符号数时,负数转换为大的正数(可以理解为原值加上2的n次方),而正数保持不变。

无符号数转换为有符号数时,对于小的数将保持原值,对于大的数则转换为负数(可以理解为原值减去2的n次方)。

今晚在看C的时候突然想到如果把大于unsigned int的范围的数据赋予 该类型变量,printf出来会是什么样。

void main()
{unsigned int a;a=7000000000;printf("a=%d\n",a);printf("a=%u\n",a):
}

这两个结果是完全不一样的。

几个小例子:

题目一:

int a = -1;

unsigned int b = 1;

printf("%d", a > b);

结果输出:1

因为无符号数与有符号数比较时,要将有符号数转化为无符号数,再来比较。a转化为无符号数后就是0xFFFFFFFF,肯定大于b

题目二:

char a = -1;

unsigned char b = 1;

printf("%d", a > b);

结果输出:0

奇怪了,怎么会这样?这是因为两者被提升为int了,a提升为int就表示-1,b提升为int 就是1,前者小于后者。注意了这里不是像题目一里一样简单的把char转化为unsigned char了

题目三:

int a = -1;

unsigned char b = -1;

printf("%d\n", a < b);

结果输出是:1

原因在于要把b提升为int就是255当然大于-1了,unsigned char 先提升为int,送入int的低八位中,高位全部补零。

题目四:

char a = -1;

unsigned int b = -1;

printf("%d\n", a == b);

结果输出:1

原因是char类型被扩展为unsigned int后与b相等,同为0xFFFFFFFF

小于int的提升到int,int之后都是从signed -> unsigned

对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了。

一定要记住如果需要使用有符号数时不要忘记强制转换

转载于:https://www.cnblogs.com/JSD1207ZX/p/9386280.html

C语言中 有符号数、无符号数、整数溢出相关推荐

  1. c语言无符号整型右移,c语言 java 有符号数,无符号数. 左移,右移运算

    1: c语言区分有符号数,无符号数.有符号数是符号位在首位,无符号数首位就是普通位数. java只有有符号数,换句话说java二进制中首位都是符号位.0正1负. 2: 左移在所有语言中只是左移,不存在 ...

  2. C语言中有符号数和无符号数的问题

    C语言中有符号数和无符号数的问题 项目说明     考虑下列代码, 这段代码试图计算数组a中所有元素的和, 其中元素的数量由参数length给出: /* WARNING: This is buggy ...

  3. C语言有符号数和无符号数的判断方法

    title: C语言有符号数和无符号数的判断方法 date: 2019-2-12 15:39:26 tags: C 学完CSAPP有符号数和无符号数的部分后冒出了这个问题,在网上查找资料后总结下.应用 ...

  4. 80x86汇编:将AL中的8位无符号数转换为压缩型BCD数放入AX

    将AL中的8位无符号数转换为压缩型BCD数放入AX中. ;------------------------------------- 最佳答案: MOV  AH,  0         MOV  BL ...

  5. c语言中换行符与回车符的区别,C语言中换行符与回车符的区别

    本文章详细介绍了回车与换行符的由来和区别.讲解,通俗易懂,可以使自己深入理解它们 C语言中换行符与回车符的区别 能不能说"换行符就是输入完一行内容后,光标转到下一行的起始位置",而 ...

  6. c语言中不用换行读符而直接换行,C语言中换行符与回车符的区别

    1.C 语言中换行符与回车符的区别能不能说"换行符就是输入完一行内容后,光标转到下一行的起始位置",而"回车符就是输入完一行后光标转到该行的起始位置,其并不换行" ...

  7. 2_C语言中的数据类型 (四)整数与无符号数

    1.1       sizeof关键字 sizeof是c语言关键字,功能是求指定数据类型在内存中的大小,单位:字节 sizeof与size_t类型 1.1       int类型 1.1.1      ...

  8. c语言 有符号数与0作比较大小,C语言中有符号数与无符号数能否进行比较运算...

    无符号数和有符号数是不能进行比较运算的,否则可能会出现意想不到的错误,且极难检查出来! 首先肯几个例子(假设在32位的机器上): 1         1. 0 == 0U 2         2. - ...

  9. 【C语言】有符号和无符号数的比较运算

    int a = -1;unsigned int b = 1;if(a < b)printf("a < b\r\n");elseprintf("a > b ...

  10. c语言中换行符的ans2码,二级C语言复习

    <二级C语言复习>由会员分享,可在线阅读,更多相关<二级C语言复习(113页珍藏版)>请在人人文库网上搜索. 1.C程序设计复习,(一)要点 (二)概念 50% -疑难举例 ( ...

最新文章

  1. 第七课.含隐变量的参数估计
  2. Java中Scanner的使用方法
  3. 根据html页面模板动态生成html页面(c#类)
  4. 记录:通过SSH远程连接Ubuntu
  5. node nightmare 网页自动化测试 sample
  6. 【华为云技术分享】解析:物联网数据分析服务如何做?
  7. JavaScript编辑器推荐
  8. B站视频缓存 音频和视频批量合并
  9. 【概率论】6-4:分布连续性修正(The Correction for Continuity)
  10. 深入理解Android相机体系结构之八
  11. 家乐福中国独立上市,是苏宁的一颗“定心丸”吗?
  12. 利用球谐系数计算函数值及利用EGM球谐系数计算重力异常
  13. 股票市场量化分析matlab,(特价书)MATLAB金融算法分析实战:基于机器学习的股票量化分析...
  14. jQuery思维导图
  15. 初入Java,安装jdk,ij编译,运行
  16. 数据库作业:关系数据库及相关概念
  17. 转载 actor-critic的收敛性问题
  18. LintCode python入门题
  19. undefined reference to `cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::all
  20. 临床基因组/外显组数据分析实战技术研讨会(2023.1)

热门文章

  1. 研发项目工时统计工具哪个好?9大工时管理系统盘点
  2. 60级怀旧服最新服务器人口排名,魔兽世界怀旧服人口普查2019 wow怀旧服人口比例查询最新...
  3. 开源crm suitecrm docker安装教程
  4. PHP设计模式系列 - 单例
  5. AD17 画差分蛇形走线
  6. WEB页面SEO —— 提升网页加载速度:对外联css,以及js使用了延迟加载以及dns-prefetch,preconnect,prefetch和prerender
  7. 初学XML,用什么编辑器?
  8. /usr/bin/ld: i386 architecture of input file `xx‘ is incompatible with i386:x86-64 output
  9. 基于JavaWEB+MySQL的二手闲置物品交易网站系统
  10. Android手机系统版本号、IMEI、手机厂商、手机型号