《6》

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 要换成无符号数
怎么换:

  1. int 在内存中占32位
  2. 2 ^ 32 = 4,294,967,296 //这是已经转换成10进制了
  3. 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 相加减


为什么?


先记住是这样计算的,
需要了解底层知识

原码,补码,反码,借位,模


真消磨我热情!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容