问题描述:
根据下面代码回答一下下列问题。
// Created by 黑马程序员.
#include "iostream"
#include "windows.h"
using namespace std;
int main()
{
SetConsoleOutputCP(CP_UTF8);
// 有符号:signed(可选), 无符号:unsigned(必写)
signed int num1 = 10; // 都是有符号int
int num2 = -10; // 都是有符号int
cout << num1 << "," << num2 << endl;
unsigned int num3 = 30; // 无符号的数字,必须大于等于0
unsigned int num33 = -30; // 假如无符号的数字,小于0,为什么输出的结果是这个小于0的有符号补码对应的无符号数字的十进制数字呢,而不是报错呢?
cout << num3 << endl;
cout << num33 << endl;
// long 无符号
unsigned long num4 = 50;
// 无符号的int、short、long 有快捷写法
u_short num5 = 100; // 等同于 unsigned short
u_int num6 = 200; // 等同于 unsigned int
u_long num7 = 1000; // 等同于 unsigned long
cout << num5 << "," << num6 << "," << num7 << endl;
return 0;
}
在C++中有符号和无符号的范围是什么?
如何声明和赋值有符号数呢?
如何声明和赋值无符号数呢?
有符号数的声明可以省略吗?可以。
无符号数的声明可以省略吗?不可以。
无符号数字简略声明方式是什么呢?
无符号数字简略声明方式需要引入#include "windows.h"吗?是的
问题解答:
在 C++ 中,有符号数和无符号数的范围以及声明和赋值的方式如下:
1. 有符号和无符号的范围
-
有符号整数(signed):
int
: 通常为 -2,147,483,648 到 2,147,483,647(32 位系统)short
: 通常为 -32,768 到 32,767(16 位系统)long
: 通常为 -2,147,483,648 到 2,147,483,647(32 位系统,64 位系统上可以是更大的范围)long long
: 通常为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(64 位系统)
-
无符号整数(unsigned):
unsigned int
: 0 到 4,294,967,295(32 位系统)unsigned short
: 0 到 65,535(16 位系统)unsigned long
: 0 到 4,294,967,295(32 位系统,64 位系统上可以是更大的范围)unsigned long long
: 0 到 18,446,744,073,709,551,615(64 位系统)
2. 如何声明和赋值
-
有符号数的声明与赋值:
signed int num1 = 10; // 显式声明
int num2 = -10; // 默认就是有符号int,可以省略signed
-
无符号数的声明与赋值:
unsigned int num3 = 30; // 必须声明为unsigned
unsigned int num33 = -30; // 会将-30转为无符号数对应的值
3. 有符号数的声明可以省略吗?
- 可以省略:有符号数的声明可以直接使用
int
或short
,默认就是有符号的。
4. 无符号数的声明可以省略吗?
- 不可以:无符号数的声明必须显式使用
unsigned
。
5. 无符号数字的简略声明方式
- 简略声明方式:
u_short num5 = 100; // 等同于 unsigned short
u_int num6 = 200; // 等同于 unsigned int
u_long num7 = 1000; // 等同于 unsigned long
6. 引入 #include "windows.h"
的必要性
- 引入
#include "windows.h"
的必要性:虽然在这段代码中使用了u_short
、u_int
和u_long
这类简略写法,通常需要引入windows.h
头文件。这些类型在 Windows API 中定义,因此如果希望使用这些类型,最好引入相应的头文件。
7. 解释 unsigned int num33 = -30;
的结果
当你执行 unsigned int num33 = -30;
时,编译器将 -30 转换为无符号整数的补码形式。在 C++ 中,负数会被视为它的补码,然后再被赋值给无符号变量,最终输出的结果是无符号数对应的十进制值,4294967266。这里没有报错,因为 C++ 支持从有符号到无符号的隐式转换。