C语言signed与unsigned

C语言signed与unsigned教程

C 语言 中的 整型shortintlonglong long) 是有两种类型的,即有符号(signed)型与无符号(unsigned)型。

signed与unsigned区别

有符号(signed)也就是该整型可以表示正数也可以表示负数,而无符号(unsigned)则表示该整数只能表示正数,不能表示负数。

signed 存储符号是有代价的,代价就是存储空间中的一个比特位专门用来存储符号,这一位不能表示数值。一般来说,同类型的 signed 能够存储的数的绝对值大小要小于 undigned。

在我们定义变量时,如果没有显式声明是 signed 还是 unsigned,那么默认就是 signed。

signed详解

语法

signed type varname = value;

参数

参数 描述
signed 定义有符号变量时,使用的修饰符,可以省略,默认就是有符号。
type 需要定义的变量的类型,只能是整型,比如 short、int、long 和 long long。
varname 变量名。
value 可选,变量的初始值,该值不可以超过 signed与unsigned 类型的最大值。

说明

使用 signed 定义了一个有符号的变量 varname,其数据类型是 type。

unsigned详解

语法

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 <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); }

程序运行后,控制台输出如下:

73_C语言signed.png

我们首先,定义了一个 int 类型的 变量,在 int 前面我们没有加任何的修饰符,此时,就是默认的定义的是 signed,即有符号类型的。

接着,我们又定义了一个 signed int 类型的变量 b,即是有符号类型的,因为是有符号的,因此,可以赋值为负数。

最后,我们再次使用 unsigned 定义了两个 unsigned 类型的变量,即无符号类型的,无符号类型的变量只能赋值为正整数。

定义signed与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); }

程序运行后,控制台输出如下:

74_C语言signed与unsigned.png

我们首先,定义了一个 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。