文章目录

  • 问题发现
    • 什么是无符号整形
      • 补码的计算
    • 无符号整形的输出
      • 正确时:
      • 错误时:
  • 问题解决
    • int用%d和%u输出
    • unsigned int用%d和%u输出

问题发现

近日在练习过程中发现无符号整形数如果赋值为“-1”可以用%d进行输出,从而得到问题
代码如下

#include<stdio.h>
int main()
{unsigned int e = -1;  //输出结果是-1,说明这里无符号整形也能储存-1,问题不明 printf("unsigned int=%d\n",e);return 0;}

结果如下:

unsigned int=-1

什么是无符号整形

在书中说明整形为 int 无符号整形为 unsigned int
int在储存数据空间中最高位代表数据的正负(0为正,1为负)
unsigned int 在储存中所有数据空间皆为数据值,但只能存放正数。
所以可以存放的正数范围比整形变量大一倍

例如int空间为4个字节,所以unsigned int 也为4个字节,但第一位可以表示数据而不是符号。则有以下补码:

int a =1:

00000000 00000000 00000000 00000001

int b =-1:

10000000 00000000 00000000 00000001

最大值int max = 2147483647 (231-1)

01111111 11111111 11111111 11111111

最大值unsigned int Max = ‭4294967295‬ (232-1)

11111111 11111111 11111111 11111111

补码的计算

正整数的补码是其二进制表示,与原码相同

例:+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)

求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1 。
同一个数字在不同的补码表示形式中是不同的。
比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。

例:求-5的补码。
-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)
所以-5的补码是11111011。

无符号整形的输出

无符号整形在输出时要用%u格式来进行输出(十进制无符号数),若赋值为负值则会输出错误(如int类型负数)

例如:

正确时:

 unsigned int a = 30;printf("unsigned int=%u\n",a);

输出为

 30

错误时:

 unsigned int a = -30;printf("unsigned int=%u\n",a);

输出为

 4294967266

问题解决

int用%d和%u输出

在查阅资料后发现,C中%d与%u的区别是程序如何去解释这一变量的数据
所以,%d在解释过程中第一位数据代表了符号,%u第一位数据代表了数据值
在输出一下数据时就有:

int a = -1;
printf("%d\n%u",a);
-1
4294967295

因为-1的补码为

11111111 11111111 11111111 11111111

%d解释过程:

1.第一位是1,所以为负值。
2.由补码再求补码,得到以下补码

10000000 00000000 00000000 00000001

3.输出结果 -1

%u解释过程:
直接将其按源码处理,所以值为232-1 = 4294967295

unsigned int用%d和%u输出

经过上面的讨论,有如下代码

unsigned int a = -1;
printf("%d\n%u",a);

输出为

-1
4294967295

同理,在赋值时,-1的源码被转换为补码:

11111111 11111111 11111111 11111111

所以在赋值到unsigned int 中时也是相同的,所以在经过%d%u解释后输出的值仍为-1 和 4294967295。其他负数值同理。

C语言无符号数赋值为负数时的%d%u输出问题解释相关推荐

  1. C语言无符号数与有符号数的运算原则

    int main(void) {for (int i = -1; i < sizeof(int); i++) {printf("%d\n", i);}return 0; } ...

  2. C语言无符号数运算问题

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...

  3. 给无符号数赋值负数(有符号数)的理解(unsigned\signedf)

    无符号数赋负数(有符号数)就类似于给字符型变量赋数值(char word=0x56),对相同的值不同的类型解析 //s16:signed short; u16:unsigned shorts16 te ...

  4. 关于c语言在循环赋值字符时出现乱码情况

    c语言有个很奇怪的情况,有时候我们使用循环给一个新的字符数组赋值时打印出来的字符串是乱码,明明赋值都没有错: 但是运行起来是这样的: 当循环次数大于等于3时: 最后经过测试发现:在某些编译器当循环小于 ...

  5. c语言无符号数除法,[求助]关于双字节无符号数除法

    是不是大家现在全部都使用C语言了呢? 这些是从keilc中的反汇编来的,个人感觉代码很紧凑.值得学习. C?UIDIV: C:0x0003    BC000B   CJNE     R4,#0x00, ...

  6. c语言无符号数最大值和最小值,微机原理中设计一个程序,求10个无符号数的最大值...

    满意答案 DATA SEGMENT ARY DW 025AH,1357H,776H,0040H,05C3H,36D0H,720FH,082AH,019DH,0124H ORG 0050H MAX DW ...

  7. C90标准中无符号数与有符号数的比较以及原因解释(关系式-2147483648<2147483647结果为假)

    在C90标准下进行编译并执行: gcc -o num -g num.c 可以看到如上结果,第一个结果看起来非常不符合常识为什么-2147483648<2147483647得到的结果是0即fals ...

  8. C语言中无符号数和有符号数之间的比较和运算

    学C语言的同学看看以下代码运行结果会多少 源代码 #include <stdio.h> void main(void) {unsigned char uchar_num = 1;char ...

  9. c语言 int 型 无符号数 %u

    %u,c语言无符号数输出 用例 : unsigned num:printf("%u",num): num范围 0-4294967295 4294967295=1<<32 ...

最新文章

  1. iptables 入门
  2. plotly可视化绘制混合图
  3. 陕西中小企业促进局 e-mail_重点注意2020陕西工程师职称评审破格指南
  4. 开源应用框架BitAdminCore:更新日志20180817
  5. CVPR 2020 《Where Does It Exist: Spatio-Temporal Video Grounding for Multi-Form Sentences》论文笔记
  6. HDFS的副本存放策略(机架感知策略)
  7. 关于更新系统后CocoaPods不能使用的问题
  8. 首批拟科创板IPO名单今日揭晓!
  9. 百万年薪的腾讯员工买得起深圳房子吗?
  10. spring mvc 静态资源拦截
  11. 离散数学第二版屈婉玲教材pdf_离散数学 第二版 [屈婉玲,耿素云,张立昂 编著] 2015年版...
  12. 【STM32+STM32CubeMX】控制ws2812b灯珠
  13. PSpice应用B-2
  14. 努比亚服务器设置在哪个文件夹,【小师傅教程】关于 努比亚自带邮箱 设置
  15. linux音乐应用程序,适用于节拍,循环,录音的最佳免费Linux音乐制作应用程序 | MOS86...
  16. 【排序算法】快速排序的分析改进
  17. Python3 使用百度云 API 接口实现音频文件转写
  18. flutter系列之:如丝般顺滑的SliverAppBar
  19. python爬虫之必应图片
  20. 学校图书管理系统 终结篇

热门文章

  1. win10软件拒绝访问删不掉_Win10文件夹无法访问拒绝访问怎么解决?
  2. 2018.8.9日,预习笔记,Linux软件包安装和卸载
  3. 移动客户端与服务端离线数据上报功能解决方案
  4. 2022/04/29 第一次晋升答辩总结
  5. 【虚拟化与云计算】走进Docker
  6. python画美图_用python做个街拍美图手册
  7. 计算机三级网络技术知识点大全(一)
  8. 基于Python摄影图片分享系统设计与实现 开题报告
  9. 普通一本的计算机专业好就业吗,放弃985大学冷门专业,填报普通一本热门专业,值吗?...
  10. NIOS 外存 SDRAM(华邦 W9864G6KH)