C++primer的奇怪问题
无符号数与有符号数相加
# include "iostream"
int main()
{
unsigned u = 10;
int i = -42;
std::cout << i + i << std::endl; //-84
std::cout << u + i << std::endl; //4294967264
return 0;
}
u+i
(有符号数与无符号数相加)
首先 i 要换成无符号数
怎么换:
- int 在内存中占32位
- 2 ^ 32 = 4,294,967,296 //这是已经转换成10进制了
- 4,294,967,296 - 42 + 10 = 4294967264 //10进制之间的相加减
查阅相关的笔记,和以往C语言的记录
计算机在底层用二进制来表示的‘
计算机规定内部的二进制所要求达到的位数为8位,16位, 32位
举个例子理解下:
int a = 1, int b = 2;
输出a + b;
在计算机来说:
1 转换成 二进制。但是int占32位数
1 转换成二进制:1
在计算机内部,int为32位
0000 0000 0000 0000 0000 0000 0000 0001
(位数不够,高位补零)
同理b也是这样
然后相加
再转化为十进制: 2
原题
原理:
int 在二进制 为 32位 ,即是4个字节(1字节等于8位)
42转换成二进制:
在32位内部为:
0000 0000 0000 0000 0000 0000 0010 1010
-42 为负数
在内存中用反码表示
1111 1111 1111 1111 1111 1111 1101 0101
补码 : 是负数在计算机内部的表示
补码:1111 1111 1111 1111 1111 1111 1101 0110
转回十进制表示:4294967254
最后:
4294967254 + 10 = 4294967264
为什么这么麻烦?
当int(负数时候)转去无符号unsigned int 的时候会这样的?
这里就说到了 类型转换 的问题
在上述的代码中,int会强制转换为unsigned int
int是有符号位的,而unsigned int 是无符号位的
这个符号位通常是数据的最高位,1是负数的,0是正数的
所以 int(负数)要去掉负号,才能和unsigned int 相加减
为什么?
先记住是这样计算的,
需要了解底层知识
有
原码,补码,反码,借位,模
真消磨我热情!