c语言 unsigned与signed及其溢出问题

本文详细介绍了C语言中整数类型的溢出现象,包括有符号和无符号整型的最大值和最小值。通过实例展示了溢出后数值如何转变为最小值,并解释了溢出的原因。同时,讨论了隐式类型转换在输出时的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不同处
 unsigned int a = -1;
 int b = -1;
 printf("%d %d \n", a, b); // -1 -1
 printf("%u %u", a, b);    // 4294967295 4294967295 

\u是无符号输出 可以理解为都是正数输出
正常int 一个 -1 是以补码的形式存储 4字节int 就是 11111111 11111111 11111111 11111111
在读取的时候 首位是1表示是负数 然后取反码 最后位 +1 就成了 10000000 00000000 00000000 00000001
读取有符号整数值就是-1
无符号读取的话就忽略查看首位是1还是0都按照正常二进制计算,就成了二进制能表示的int类型最大数:4294967295

unsigned 类型和 signed能表示的最大数也有差异 比如 无符号能表示100个数 从0 ~ 100 有符号只能是 -50 ~ 50要兼顾负数的一面

a,b 输出结果相同是因为 按照\d输出会隐式转换成有符号整形输出即转换成int类型输出,按照 \u输出会转换成无符号整型输出

溢出
最大值

signed int : printf("%d\n", ~(unsigned int)0 / 2); //2147483647
unsigned int: printf("%u\n", ~(unsigned int)0); //4294967295
当无符号0以二进制存储在内存中时,每一位都为0,以32位int为例,0(unsigned int)的二进制为:
00000000 00000000 00000000 00000000
按位取反(~)后变成:
11111111 11111111 11111111 11111111
此时的十进制为:
4294967295
除以2(int类型中有一半表示负数,且比正数多一个),得到:
2147483647
即为32位int型最大值

最小值

signed int 包含正数和负数 负数比正数多一个
最大 2147483647
最小 -(2147483647 + 1) = -2147483648
unsigned int 无符号都是正数 最小就是0 最大4294967295

溢出后值变成什么

signed 溢出

  printf("%d\n", ~(unsigned int)0 / 2);       //  2147483647
  printf("%d\n", (~(unsigned int)0 / 2) + 1); // -2147483648

如上 溢出后变成了最小值
unsigned

  printf("%u\n", ~(unsigned int)0);           // 4294967295
  printf("%u\n", (~(unsigned int)0) + 1);     // 0

溢出后同样变成了最小值
虽然不知道为什么会这样🤔

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值