C++ 中的 整型 (short、int、long、long long) 是有两种类型的,即有符号(signed)型与无符号(unsigned)型。
有符号(signed)也就是该整型可以表示正数也可以表示负数,而无符号(unsigned)则表示该整数只能表示正数,不能表示负数。
signed 存储符号是有代价的,代价就是存储空间中的一个比特位专门用来存储符号,这一位不能表示数值。一般来说,同类型的 signed 能够存储的数的绝对值大小要小于 undigned。
在我们定义变量时,如果没有显式声明是 signed 还是 unsigned,那么默认就是 signed。
signed type varname = value;
参数 | 描述 |
---|---|
signed | 定义有符号变量时,使用的修饰符,可以省略,默认就是有符号。 |
type | 需要定义的变量的类型,只能是整型,比如 short、int、long 和 long long。 |
varname | 变量名。 |
value | 可选,变量的初始值,该值不可以超过 signed与unsigned 类型的最大值。 |
使用 signed 定义了一个有符号的变量 varname,其数据类型是 type。
unsigned type varname = value;
参数
参数
描述
unsigned
定义无符号变量时,使用的修饰符,不可以省略。
type
需要定义的变量的类型,只能是整型,比如 short、int、long 和 long long。
varname
变量名。
value
可选,变量的初始值,该值不可以超过 signed与unsigned 类型的最大值。
说明
使用 unsigned 定义了一个无符号的变量 varname,其数据类型是 type,打印 unsigned 变量时,在格式化占位符前面需要使用 %u。
signed与unsigned取值范围
取值范围
数据类型
signed
unsigned
short
-32768 ~ 32767
-32768 ~ 0xffffU
int
-2147483648 ~ 2147483647
-2147483648 ~ 0xffffffffU
long
-2147483647L - 1 ~ 2147483647L
-2147483647L - 1 ~ 0xffffffffUL
long long
-9223372036854775807ll - 1 ~ 9223372036854775807ll
-9223372036854775807ll - 1 ~ 0xffffffffffffffffull
说明
其中,unsigned short 在 limits.h 的头文件中,使用的常量值为 USHRT_MAX,unsigned int 的常量值为 UINT_MAX,unsigned long 的常量值为 ULONG_MAX,unsigned long long 的常量值为 ULLONG_MAX。
案例
定义signed与unsigned变量
使用 signed 与 unsigned int 定义 signed 与 unsigned 变量
#include <iostream>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
int a = 100;
signed int b = -200;
unsigned int c = 300;
unsigned long d = 1024;
cout << "a = " << a << " b = " << b << endl;
cout << "c = " << c << " d = " << d << endl;
return 0;
}
程序运行后,控制台输出如下:
我们首先,定义了一个 int 类型的 变量,在 int 前面我们没有加任何的修饰符,此时,就是默认的定义的是 signed,即有符号类型的。
接着,我们又定义了一个 signed int 类型的变量 b,即是有符号类型的,因为是有符号的,因此,可以赋值为负数。
最后,我们再次使用 unsigned 定义了两个 unsigned 类型的变量,即无符号类型的,无符号类型的变量只能赋值为正整数。
定义signed与unsigned变量
使用 signed 与 unsigned int 定义 signed 与 unsigned 变量
#include <iostream>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
unsigned int a = 100;
unsigned int b = -100;
unsigned int c = 0 - 1;
cout << "a = " << a << " b = " << b << " c = " << c << endl;
return 0;
}
程序运行后,控制台输出如下:
我们首先,定义了一个 unsigned int 类型的变量 a,并赋值为 100,接着,我们定义了一个 unsigned int 类型的变量 b 并赋值为 -100。
因为,unsigned 只能存储无符号类型,因此,这里我们赋值为了负数,我们打印变量 b 的值发现此时不是我们赋值的 -100。
最后,我们将变量 c 赋值为 0 - 1
,应该是 -1,但最后打印的却不是 -1,因为 unsigned 是无符号类型,不可以表示负数。
C++ signed与unsigned总结
有符号(signed)也就是该整型可以表示正数也可以表示负数,而无符号(unsigned)则表示该整数只能表示正数,不能表示负数。
signed 存储符号是有代价的,代价就是存储空间中的一个比特位专门用来存储符号,这一位不能表示数值。一般来说,同类型的 signed 能够存储的数的绝对值大小要小于 undigned。
在我们定义变量时,如果没有显式声明是 signed 还是 unsigned,那么默认就是 signed。