unsigned是整形的一种类型,表示无符号,一般用于unsigned int和unsigned char,如果没有理解unsigned的意义将会在做题中掉入陷阱,下面通过介绍几个例子来说明:
1、

int main()
{unsigned  int  i;for (i = 10;i >= 0; i--){printf("你好\n");}return 0;
}

这个程序,打眼一看结果就是输出11个“你好”,然而并不是这样,输出的一个死循环,为什么呢?
当i=0时,输出第11次“你好”,再次执行i–时,i本应该等于-1,此时已经不符合i>=0的条件,应该退出循环,但应该注意i是无符号整形,当i=-1时,此时的i是有符号的,此时就要用到数据在计算机中的存储方式是二进制。
-1:
原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
由于-1是负数,故原码最高位为1,取反码时,最高位不参与,最终的补码就是-1在计算机中存储的二进制,此时i就默认等于4294967295,因为其原码和-1的补码相同,也就是说i永远满足i>=0条件。
2、

int main()
{unsigned char a[500];int i;for (i = 0;i < 500; i++){a[i] = -1 - i;}printf("%d",strlen(a));system("pause");return 0;
}

和上面一道题一样,打眼一看结果就是500,毫无疑问,然而结果总是出人意料,结果是255,这又是为什么呢?

unsigned char的取值范围是0-255,当i=0时,a[0]=255,a[1]=254,当i=255时,-1-i=-256,此时已超过了unsigned char的范围。
-256:
原码:1 0000 0000
反码:0 1111 1111
补码:1 0000 0000
因为unsigned char 是一个字节,8个bit,所以就失去了最高位1,此时a[255]=0,注意后面的strlen(a)函数,这是一个计算数组元素个数的函数,逢“0”就停止计算,就是说计算到a[255]的时候就停止了,计算了从a[0]-a[254]共255个数,最终结果就是255。

Unsigned 陷阱相关推荐

  1. C++ sizeof 使用规则及陷阱分析【转】

    目录 一.什么是sizeof 二.sizeof用法 三.基本数据类型的sizeof 四.复杂数据类型的sizeof及其数据对齐问题 五.class类型的sizeof特别探讨 六.总结 一.什么是siz ...

  2. 提防iostream使用中的一个“陷阱”

    提防iostream使用中的一个"陷阱" 先看下面的示例代码: template < typename T > void test() {  T o;  for(T i ...

  3. 负数赋值给无符号数的陷阱【转】

    有没有人尝试过将负数赋给一个无符号整型变量?知不知道这样做会发生什么?还没有尝试的就让我们来探索下无符号整型隐藏的秘密. 先来看看下面代码: int main() {       unsigned i ...

  4. C/C++返回内部静态成员的陷阱

    在我们用C/C++开发的过程中,总是有一个问题会给我们带来苦恼.这个问题就是函数内和函数外代码需要通过一块内存来交互(比如,函数返回字符串),这个问题困扰和很多开发人员.如果你的内存是在函数内栈上分配 ...

  5. C陷阱与缺陷学习笔记

    导读 程序是由符号(token)序列所组成的,将程序分解成符号的过程,成为"词法分析". 符号构成更大的单元--语句和声明,语法细节最终决定了语义. 词法陷阱 符号(token)指 ...

  6. 可变参数的使用之va_arg的陷阱s

    在写程序的时候用到了可变参数,但是在调试程序的时候发现,当可变参数为float类型的时候竟然是出了莫名其妙的一些错误,搞得一头雾水一脸懵逼,上网查查去,看到了这样的帖子: 转载自:https://ri ...

  7. (不误正业)鼓励做题的时间陷阱

    前言 在家闲的无聊想着没人陪我做题就写了一个可以(或许)鼓励做题的东西 正题 关于时间陷阱 时间陷阱是种游戏类型,玩家开始时有一个倒计时,没完成一个任务会增加倒计时,时间到了那么任务就输了. 这里编写 ...

  8. 第一百零四期:搞清这些陷阱,NULL和三值逻辑再也不作妖

    NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值.数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的 ...

  9. c语言陷阱试题,超级经典计算机二级C语言陷阱考试题.doc

    超级经典计算机二级C语言陷阱考试题 超级经典计算机二级C语言陷阱考试题 若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为___d___. a)*(a[i]+j) b)(a+ ...

最新文章

  1. 差异分析完整解决方案-EasyAovWlxPlot使用指南
  2. java.lang.UnsatisfiedLinkError:no jhdf5 in java.library.path问题的解决
  3. 调查显示:中国医生乐于以新媒体为途径普及健康科普信息
  4. android debug database 源码解析
  5. python定_Python 定值类
  6. Docker怎样提交镜像(把容器打成镜像)
  7. dubbo的学习使用,第一章
  8. su、sudo、sudo su、sudo -i的用法和区别
  9. java树洞_SSM框架开发案例——铁大树洞后台管理系统
  10. 如何用Map对象创建Set对象
  11. 西工大学计算机专业考研容易吗,2022年西北工业大学计算机专业考研成功经验...
  12. windows搭建ABD环境 搭建ADB开发环境
  13. 45. Use member function templates to accept all compatible types.
  14. DB2数据库中用户和Schema的概念与理解
  15. 美化windows xp 完全教程
  16. bittorrent下载_面向初学者的BitTorrent:如何开始下载Torrent
  17. Inpaint9.1最新网页版下载及inpaint怎么去水印教程
  18. Springboot过滤器中注入Bean
  19. python中对Routers的理解
  20. AI 人工智能 干货分享

热门文章

  1. C# WinForm开发系列 - GDI+【转】
  2. 开发原生的 Google 眼镜应用 【已翻译100%】(2/2)
  3. 发现保存GIF格式后相素发生变化咋办
  4. Android Studio导入工程的正确姿势
  5. git reset, git checkout, git revert 区别 (译)
  6. java远程debug
  7. 基于AgileEAS.NET企业应用平台实现基于SOA架构的应用整合方案-开篇
  8. SQL Server 开发指南(经典教程)
  9. dubbo简易监控中心安装
  10. oracle下lag和lead分析函数