C++基础--main函数返回值问题

C++基础-main函数返回值问题

背景

在翻看C++ ”圣经“ ----《C++ Primer》时看到一个思考题 ”返回值 -1 通常作为程序错误的标识。当程序的 main 函数返回值为 -1 时,观察系统如何处理返回的错误标识“,编写程序验证:

#include 
#include 
#include 

using namespace std;

int main()
{
  cout << "sssss" <<endl;
  return -1;
}

编译运行之后使用 ”echo $?“ 观察系统接收到的返回值,发现为255。这是因为计算机采用补码形式存储数据

计算机基础-数字的表示方法

计算机中有符号整数有三种表示方法-------原码、反码、补码。

  • 原码:第一位表示符号位,后面为有符号整数绝对值的二进制形式

  • 反码:有符号正整数的反码等于原码;负整数的反码为第一位符号位不变,其后每一位变成相反数

  • 补码:有符号正整数的补码等于原码;负整数的补码为反码+1

    总结:

    有符号正整数原码=反码=补码

    有符号负整数反码等于原码除符号位不变外,其余每一位取反;补码等于原码除符号位不变外,其余每一位取反再加1

举例:

十进制-----------------二进制原码-------------反码-----------------补码
  9                   0000 1001          0000 1001           0000 1001
 -9                   1000 1001          1111 0110           1111 0111
 127                  0111 1111          0111 1111           0111 1111
-127                  1111 1111          1000 0000           1000 0001
 128                  1000 0000          1000 0000           1000 0000
-128             0001 1000 0000     0001 0111 1111      0001 1000 0000  

C++基础-main函数返回值问题

回到main函数的返回值问题,为何显示255?

因为系统用8bits的无符号数标识退出状态,所以退出的状态值为0至255,而有符号整型 -1 的补码形式为 1111 1111 对应无符号整型为 255

那么问题来了,既然系统的退出状态值为8bits的无符号数,取值范围就是0-255,如果我在函数里面返回了超255的数又会怎样呢?很简单,返回的值会被截断

比如:

如果main函数最终return 257;
257:
二进制原码=反码=补码:0000 0001 0000 0001

那么,系统会截取最低8bits,即 0000 0001 ,最终编译运行之后再”echo $?“ 得到的值就是 1

你可能感兴趣的:(c++)