在C语言的课本中,我们常见的是%u,但我们平时在写代码常用的确是%d,它们二者之间有什么区别呢?

表示形式上

%u表示输入输出格式说明符,是按照unsigned int(无符号十进制数据)格式输入或输出数据。%d则表示signed
int(有符号十进制数据)格式输入或输出数据。

举例:

#include<stdio.h>
int main()
{char a = -28;printf("%d\n", a);printf("%u\n", a);return 0;
}

上篇我们讲述了char类型的数据用%d的形式是如何输出的,不懂的小伙伴可以去看上篇文章,这里我们主要讲述

以%u的形式如何输出:

首先我们先写出变量a的二进制形式:
//原码:10000000000000000000000010000000
//反码:1111111111111111111111111111011111111
//补码:111111111111111111111111111110000000
进行截断:10000000
进行整型提升:111111111111111111111110000000-----该数的补码
由于该数要以%u,无符号的形式进行打印,所以原码,补码,反码相同。即打印结果:4292967168

下面我们通过一张图来了解有符号和无符号在内存中的存储情况。


通过上面这张图,我们了解到有符号字符存储的范围是127---- -128,那么如果想表示大于127的正数呢?它是一个对称的原则,大于127的整数直接进行跳转到左半边圆表示的范围。
如下所示代码会输出什么样的结果?

#include<stdio.h>
int main()
{char a = -128;char b = 128;printf("%u\n", a);printf("%u\n", b);return 0;
}


128和-128的输出结果一样,由于有符号整数的范围已经被限制,直接代数加一定是不可取的,不过通过上面这张图我们可以得出当为有符号整数128,就相当于127加1,也就是-128。
之前我们学过了字符型的unsigned char/signed char是如何进行相加减运算的,这篇我们就来讲讲

整形的unsigned int/signed int是如何进行运算的:

举例:

#include<stdio.h>
int main()
{int i = -20;unsigned int j = 10;printf("%d\n", i + j);return 0;
}

我们让代码跑起来看看运行结果:

-10

那么它的计算过程是什么样的呢?
分析过程如下:
和之前char类型相似,首先写出两个变量的补码:

int i = -80;//原码:10000000000000000000000000010100//反码:11111111111111111111111111101011//补码:1111111111111111111111110111101100
unsigned int j = -10;(由于是无符号整形,原码,反码,补码均相同)//原码/反码/补码:00000000000000000000000000001010
i + j://补码:         11111111111111111111111111101100//原码/反码/补码:00000000000000000000000000001010//i+j:补码         11111111111111111111111111110110//i+j:反码       11111111111111111111111111110101//i+j:原码        10000000000000000000000000001010
输出结果为-10

unsigned int和signed int类型的运算和char类型不同的地方在于,它不需要整形提升这一过程。
学习了unsigned int的定义和运算方法之后,下面我们来学习

它在循环中的应用:

首先我们先来看一串代码:

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

请问它的输出结果是多少呢?如果你认为是9,8,7,6,5,4,3,2,1,0那你就大错特错了。
正确的输出结果应该是无限循环,那么有的人会问为什么是无限循环呢?
下面我们对这串代码进行分析,首先变量i被定义的类型是unsigned int而不是int,这就决定了它是不可能取到负数的,因此i>=0永远满足条件,程序会进行无限循环。

下面我们再来看一个关于char类型的应用实例:

#include<stdio.h>
#include<string.h>
int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a));return 0;
}

这串代码的输出结果又会是什么呢?
我们先对代码进行分析,首先定义字符型数组a,再使用变量i访问数组元素,当i=0,a[i]=-1,当i=1,a[i]=-2,当i=2,a[i]=-3以此类推,那么有的同学会因此得出strlen(a)的长度不就是1000吗?如果你也是这么想的,恭喜你又错了,你又忽略了一个很简单但很重要的知识点,char类型的范围是-128-----127.

这张图还有印象吗?
signed char类型的数据存储到编译器中,无论多大的数字,编译器都会将该数字转为-128-------127之间的一个数,并不会超出这个范围。因此strlen(a)的值为255.
看到这里你是不是觉得自己这次一定学会啦?
那我再检测一下你是不是真的学会了!!!

#include<stdio.h>
int main()
{unsigned char i = 0;for (i = 0; i <= 255; i++){printf("hello world!");}printf("%d\n", count);return 0;
}

如果你认为输出结果是无限循环,那就证明你大概是学会了,为什么是无限循环呢?还是要用到我们之前学过的无符号和有符号的范围,这里的变量i被定义的是unsigned char,无符号的范围是0-255,而循环的条件即为i<=255,和上文提到的例子相同,unsigned char类型的数据存储到编译器中,无论多大的数字编译器都会将该数字转为0-255之间的一个数,并不会超出这个范围。因此循环的条件永远成立。
注:无符号数经常会导致程序进入死循环,因此在以后编写程序的过程中,无符号数字我们要谨慎使用,以免发生程序死循环现象。

C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)相关推荐

  1. c语言结构体在内存中的存储,C语言结构体在内存中的存储情况探究------内存对齐...

    条件(先看一下各个基本类型都占几个字节): voidsize_(){ printf("char类型:%d", sizeof(char)); printf("int类型:% ...

  2. 输入一个四位数将其加密后输出c语言,输入一个四位数,将其加密后输出.方法是将该数每一位的数字加9,然后除以10取余作为该位上的新数字,最后将千位上的数字和十...

    问题描述: 输入一个四位数,将其加密后输出.方法是将该数每一位的数字加9,然后除以10取余作为该位上的新数字,最后将千位上的数字和十位上的数字互换,组成加密后的新四位数. #include int m ...

  3. C语言的数据类型大全,整型数据在内存中的存储方式

    一.数据类型 通过长时间的学习C语言以及代码的编写,我掌握了很多很多的数据类型,下面就给大家罗列一下. 1.内置数据类型 char        //字符数据类型--                  ...

  4. 补码还原为原码c语言,C语言知识汇总 | 12-整数(有、无符号数)在内存中的存储——原码、反码与补码...

    加法和减法是计算机中最基本的运算,计算机时时刻刻都离不开它们,所以它们由硬件直接支持.为了提高加减法的运算效率,硬件电路要设计得尽量简单. 对于有符号数,内存要区分符号位和数值位,对于人脑来说,很容易 ...

  5. c语言中int默认是有符号还是无符号,C语言迷题:有符号数与无符号数的问题

    前些天偶然看到了一个收集C语言迷题的网站,很是感兴趣.本人对C/C++语言本身很是感兴趣,曾经做过几年相应的开发,也算是相对比较熟悉的了,但也被其中的一些问题给难住了,毕竟这些问题都是涉及到非常细节的 ...

  6. 梦开始的地方 —— C语言数据在内存中的存储(整形+浮点型)

    文章目录 整形在内存中的存储 1. 数值类型的基本分类 2. 整形在内存中的存储 1. 原码.反码.补码 2. 内存中为什么要存放补码? 3. 大小端存储 4. 无符号有符号数练习 5. 有符号数无符 ...

  7. linux有符号和无符号,有符号数和无符号数

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 学习了二进制数据,我们知道,在计算机系统中,存储的任何数据都是以二进制数据的格式存储.存储数据的最小单位是字节(Byte),一个字节的容量是八位(bit) ...

  8. 无符号数在计算机中怎么存储,计算机中数的存储

    计算机中数的存储 1.计算机的存储单元 计算机内有很多存储单元,计算机用这些存储单元存储数据,一个存储单元可以存储一个八位的二进制数,一个存储单元又称作一个字节,记作1B.计算机的处理器一次可以处理的 ...

  9. linux有符号和无符号,汇编中有符号与无符号数的区分

    转载自:http://hi.baidu.com/asmsky/blog/item/7290d20076cab6da277fb5b8.html 一.只有一个标准! 在汇编语言层面,声明变量的时候,没有 ...

最新文章

  1. 用Scrum敏捷开发工具Leangoo做Sprint迭代管理
  2. 工作107:静态路由
  3. 22条API设计的实践
  4. ubuntu配置spyder和jupyter notebook的工作目录
  5. 论文赏析[TACL19]生成模型还在用自左向右的顺序?这篇论文教你如何自动推测最佳生成顺序
  6. 教你如何保持Tuxera NTFS For Mac软件的更新
  7. 海云捷迅让OpenStack从项目实施转为服务交付
  8. 天锐绿盾避免微信传输文件泄密的一二三四
  9. 学计算机如何防辐射,如何防辐射?学这五招_39健康网
  10. r语言 c d生产函数,R语言定义多维数组和数组的运算
  11. html多图轮播淡入淡出js,原生JS实现图片轮播与淡入效果的简单实例
  12. 使用flask从零构建自动化运维平台系列三
  13. win32,win64编程永恒;语言编程需要注意的64位
  14. 调试python程序---pdb
  15. 计算机java相关英文文献,计算机专业 Java外文翻译 外文文献 英文文献.docx
  16. 充电枪cp信号控制板_通过充电枪CP信号控制常电输入的电路的制作方法
  17. Arduino ESP32 第三方库读取SD卡信息(三)
  18. SM8350 Codec通路图:bolero + wcd9385 + CS35L41
  19. 查看hive的当前参数值
  20. codeblocks卸载后再重装还是老样子

热门文章

  1. 利用计算机分析信号,计算机技术在铁路信号中的应用
  2. 【VB.net】GNSS单点定位程序
  3. 一文打通Seata源码的任督二脉
  4. 基于matlab优化工具箱的机械优化设计,基于MATLAB优化工具箱的机械优化设计.pdf...
  5. (转载)车牌识别EasyPR--开发详解
  6. Angular7编译通过typescript报错:找不到模块“@src/environments/environment”。ts(2307)”
  7. 两千年前人们要是近视了,怎么办?
  8. java季度第一天_java获取某月,某季度的第一天和最后一天
  9. 计算群论基础算法:Schreier-Sims 算法
  10. 国产芯片设备替代提升近七成,ASML和美国芯片行业损失超50亿美元