文章目录

  • 问题发现
    • 什么是无符号整形
      • 补码的计算
    • 无符号整形的输出
      • 正确时:
      • 错误时:
  • 问题解决
    • 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. 参加UI培训有发展吗?
  2. 徐直军 华为没有鸿蒙,华为徐直军:“鸿蒙”这个名字是媒体取的
  3. 应用丨其实,你每天都生活在人工智能中
  4. JAVA之间的引用传递
  5. 业余无线电通信_登山与业余无线电的完美结合,便携式电台参加VHF比赛心得体会...
  6. NIO框架之MINA详解
  7. 聚合函数 -AVG/MAX/MIN/STDDEV/VARIANCE/SUM/COUNT/MEDIAN
  8. 桌面图标有阴影怎么去掉
  9. python 图片地址_python解码data:image开头的图片地址
  10. jzoj1246-挑剔的美食家【set,贪心】
  11. 清华北大的学子们都关注什么样公众号?
  12. 并发容器(J.U.C)中的集合类
  13. Exps on March 21st
  14. 大数据平台构建常见问题
  15. iPhone X 游戏闪退:NSUnknownKeyException
  16. 云风的个人空间 : 《代码大全》读书笔记
  17. (Modern Family S01E02) Part 6  JayGloria  Jay给Manny修风扇
  18. 巴比特 | 元宇宙每日必读:用户流失,滞销频现,平台在合规和利润面前该如何平衡?...
  19. HTML5生日祝福蛋糕页面(生日蛋糕树) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册 js烟花代码 css爱心
  20. U盘数据恢复软件哪款好恢复效果好

热门文章

  1. DDOS攻击监测工具软件DDOS_Monitor下载
  2. python SM2明文密码加解密
  3. 寒假训练八(优先队列)2020.02.14(7题)
  4. Vivado DDS IP核使用、仿真、多相处理和相关计算验证
  5. python字典程序题_Python练习:字典
  6. 基于Python pyqt5的随机抽号机源代码 ,可设置抽号器的人数及刷新间隔
  7. xxljob默认登录_三千字带你搞懂XXL-JOB任务调度平台
  8. linux+格式化磁盘格式化,Linux下的磁盘格式化
  9. 心理测量学信度计算机试题,心理测量学 第三章 信度.doc
  10. 对计算机辅助英语的看法,浅谈利用计算机辅助英语语言测试