首页 > 其他分享 >c语言 unsigned与signed及其溢出问题

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

时间:2023-02-13 20:37:23浏览次数:39  
标签:11111111 int 4294967295 unsigned signed 00000000 printf 溢出


文章目录

  • ​​不同处​​
  • ​​溢出​​
  • ​​最大值​​
  • ​​最小值​​
  • ​​溢出后值变成什么​​
不同处

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

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

标签:11111111,int,4294967295,unsigned,signed,00000000,printf,溢出
From: https://blog.51cto.com/u_15964288/6054684

相关文章