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 |
---|---|---|
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 int 定义 signed 与 unsigned 变量
#include <stdio.h>
int main(int argc, char **argv)
{
printf("嗨客网(www.haicoder.net)\n");
int a = 100;
signed int b = -200;
unsigned int c = 300;
unsigned long d = 1024;
printf("a = %d, b = %d\n", a, b);
printf("c = %u, d = %u\n", c, d);
}
程序运行后,控制台输出如下:
我们首先,定义了一个 int 类型的 变量,在 int 前面我们没有加任何的修饰符,此时,就是默认的定义的是 signed,即有符号类型的。
接着,我们又定义了一个 signed int 类型的变量 b,即是有符号类型的,因为是有符号的,因此,可以赋值为负数。
最后,我们再次使用 unsigned 定义了两个 unsigned 类型的变量,即无符号类型的,无符号类型的变量只能赋值为正整数。
使用 signed 与 unsigned int 定义 signed 与 unsigned 变量
#include <stdio.h>
int main(int argc, char **argv)
{
printf("嗨客网(www.haicoder.net)\n");
unsigned int a = 100;
unsigned int b = -100;
unsigned int c = 0 - 1;
printf("a = %u, b = %u, c = %u\n", a, b, c);
}
程序运行后,控制台输出如下:
我们首先,定义了一个 unsigned int 类型的变量 a,并赋值为 100,接着,我们定义了一个 unsigned int 类型的变量 b 并赋值为 -100。
因为,unsigned 只能存储无符号类型,因此,这里我们赋值为了负数,我们打印变量 b 的值发现此时不是我们赋值的 -100。
最后,我们将变量 c 赋值为 0 - 1
,应该是 -1,但最后打印的却不是 -1,因为 unsigned 是无符号类型,不可以表示负数。
有符号(signed)也就是该整型可以表示正数也可以表示负数,而无符号(unsigned)则表示该整数只能表示正数,不能表示负数。
signed 存储符号是有代价的,代价就是存储空间中的一个比特位专门用来存储符号,这一位不能表示数值。一般来说,同类型的 signed 能够存储的数的绝对值大小要小于 undigned。
在我们定义变量时,如果没有显式声明是 signed 还是 unsigned,那么默认就是 signed。