我们学习了有符号和无符号数,可以知道,在一个字节中存放了8位的数据,例如1111 1111这样的8位二进制数据,就有:

(1) 如果把这8位二进制数据当作“有符号”数看待,那么,最高位是符号位,其余7位是数值位;

(2) 如果把这8位二进制数据当作“无符号”数看待,那么,没有符号位,8位数据都是数值位;

可以看到,同一个二进制数据,当中有符号和无符号数看待的时候,它们表示的结果是不一样的。

在C语言中,提供了unsigned这个关键字来表示无符号数。例如:

unsigned char x;

就是定义了x这个变量是无符号类型,所以它表示的数值没有符号位。例如存放1111 1111数据,因为无符号数没有符号位,全部8位数据是数值位,所以表示255这个数值。表示的最小数据就是0000 0000,既0 数值。如下是一个测试的例子。

怎么理解c语言中的无符号整数(C语言的无符号类型)(1)

程序运行的结果如下:

怎么理解c语言中的无符号整数(C语言的无符号类型)(2)

可以看到,对于255这个整数,其二进制表示为1111 1111,那么,就有:

(1) 把255赋给a1变量,当作有符号数看待,所以,符号位是1,表示负数,数值位是111 1111,那么,要表示为十进制,就是数值位取反,得到000 0000,然后,加1,得到000 0001,所以,二进制1111 1111表示为有符号数是-1。所以与输出的a1变量值是-1一致。

(2) 把255赋给a2变量,当作无符号数看待,所以,8位二进制数据1111 1111全部存储到a2变量中当作数值位,所以,a2变量输出是255。

对于a3变量的操作,我们是把一个负数赋值给无符号数a3,那么,由于-1这个数值其在1个字节中表示的二进制数为1111 1111,所以,就相当于把1111 1111数值赋给a3变量,那么,a3变量中就有1111 1111这样的数据,与a2变量存储的数据是一样的。所以,输出的数值与a2变量一样。

对于char、short、int、long 类型,可以使用unsigned关键字来修饰,定义无符号类型的数据。但是,对于 float、double类型的数据,由于是浮点数,所以,不可以使用unsigned关键字来修饰。

,