c++ - 无符号整数数组如何包含负整数?

标签 c++ arrays unsigned

我写这段代码只是为了看看如果我把一个负整数放入一个无符号整数数组中会发生什么。

#include <iostream>

int main()
{
    using namespace std;

    unsigned int array[4];
    array[0]=4;
    array[1]=4;
    array[2]=2;
    array[3]=-2;

    cout << array[0] + array[1] + array[2] + array[3] << endl;

    unsigned int b;
    b=-2;
    cout << b <<endl;

    return 0;
}

我原以为在这两种情况下都会发生整数溢出。然而,只有在第二种情况下,真正发生了。在第一种情况下,一切都表现得好像是一个普通的整数数组,而不是一个无符号整数数组。那么究竟是什么导致了这种异常行为。在任何重要的情况下,我的编译器是 gcc 4.8。谢谢您的帮助。编辑:这是我电脑上的输出

8
4294967294

最佳答案

存在整数溢出。这是原因(数字被转换为 unsigned int)

 1111 1111 1111 1111 1111 1111 1111 1110 // -2
+0000 0000 0000 0000 0000 0000 0000 0100 //+ 4
-------------------------------------------
 0000 0000 0000 0000 0000 0000 0000 0010 //= 2
+0000 0000 0000 0000 0000 0000 0000 0100 //+ 4
-------------------------------------------
 0000 0000 0000 0000 0000 0000 0000 0110 //= 6
+0000 0000 0000 0000 0000 0000 0000 0010 //+ 2
-------------------------------------------
 0000 0000 0000 0000 0000 0000 0000 1000 //= 8 -> the result

关于c++ - 无符号整数数组如何包含负整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21676164/

相关文章:

c - 为什么 unsigned int 小于零是可能的?

c++ - 无法从 'unsigned char *' 转换为 'char *'

c++ - 范围和头文件的困难

c++ - 如何制作一个带有关闭按钮且窗口左上角没有图标/菜单的窗口?

c - signed 和 unsigned int 之间的转换是否在内存中保持变量的精确位模式?

java - 将 .txt 文件的每一行分配给多维数组中的一个单元格

c++ - 如何传入对象数组 : error c2146: syntax error : missing ')' before identifier 'myMembers'

c++ - C/C++类型转换将int **转换为const int **

c++ - 理解 C++11 中的 `memory_order_acquire` 和 `memory_order_release`

php - 嵌套 SQL 查询,按分组并为每个组返回有限的行