C语言 请问signed char,unsigned char,short,unsigned sh
发布网友
发布时间:2022-04-29 00:28
我来回答
共1个回答
热心网友
时间:2022-06-26 10:28
signed
和
unsigned
是C语言中的类型指示符(type
specifier),signed
指示被声明的对象的类型为有符号整型(signed
integer
type),unsigned
指示被声明的对象的类型为无符号整型(unsigned
integer
type)。
除了用于
bit
field,单独使用的
int
即指示有符号整型,此时
signed
没有实际意义,int
和
unsigned
一同使用时指示无符号整型。
char,signed
char,unsigned
char
是三个不同的类型(char
和另外两个之一的二进制表示方法相同,至于
char
具体是否有符号,通常可通过编译指令指定)。
对于
bit
field,
signed
int
类型的
bit
field
总是有符号的,unsigned
int
类型的
bit
field
总是无符号的,而单独使用的
int
是否表示有符号,由编译器定义。
无符号数的二进制表示(object
representation)由两部分构成,即
value
bits
和
padding
bits,value
bits
是一串二进制位,第
M
个
value
bit
表示
2
的
M-1
次方,因此
N
个
value
bits
加起来就可以表示
0
到
2
的
N
次方减一
这个范围内的所有整数。padding
bits
不影响数的值(可能不存在
padding
bit
)。
有符号数的二进制表示(object
representation)由三部分构成,即
sign
bit,value
bits
和
padding
bits
,其中
sign
bit
只有一位,这一位的值为
0
时表示这个数为正数,此时它不影响有符号数的值,value
bits
的含义与无符号数中的
value
bits
相同。sign
bit
为
1
时表示这个数为负数,此时这个数可以使用原码、反码、补码
中的任何一种编码来表示数值。和无符号数一样,padding
bits
不影响数的值(可能不存在
padding
bit
)。
例如,当某个无符号类型有
32
个value
bits
时,它的第
1
个
value
bit
表示
2
的
0
次方,第
2
个
value
bit
表示
2
的
1
次方,……,第
32
个
value
bit
表示
2
的
31
次方。当所有
value
bits
都为
1
时,就表示
2
的
0
次方加
2
的
1
次方加……加
2
的
31
次方,即
2
的
32次方减一;当所有的
value
bits
都为
0
时,就表示
0
,这个无符号类型的取值范围就是
0
到
2
的
32
次方减一。
与之对应的有符号类型有
1
个sign
bit
和
31
个
value
bits,当
sign
bit
为
0
时,可以表示
0
到
2
的
31
次方减一范围内的任何一个整数,如果使用补码,当
sign
bit
为
1
时,可以看作
sign
bit
的值是
2
的
31
次方
的相反数,因此当
sign
bit
为
1
时
sign
bit
加上
value
bit
一共可以表示
2
的
31
次方
的相反数到
-1
范围内的任何一个整数,考虑所有情况,这个有符号类型的取值范围就是
2
的
31
次方
的相反数
到
2
的
32
次方减一。