新浪博客

有(无)符号char型及其溢出问题

2012-05-14 16:40阅读:
1char的有无符号类型
char 分为有符号性(signed)和无符号型(unsigned)两种:
Ø 若是signed型,就意味着取值范围为[-128,127]
Ø 若是unsigned型,就意味着取值范围为[0,255]
C语言中我们通常直接用类型char,但是它究竟是被当做signed型还是unsigned型,由编译器决定。
C语言允许我们在char前面加上关键字signed或者unsigned,这样,无论在编译器中被当做signed还是unsigned,都会按照前面加的这个关键字来决定。
例如:假设我们现在使用的编译器,把char当做signed来看到,则
char c1;
signed c2;
unsigned c3;
c1c2的取值范围都是[-128,127],而c3的取值范围则是[0,255]
所谓取值范围,是指其值在这个范围之内时,会被正确处理,超出这个范围就会发生溢出。但在这个范围之内,并不意味着它就是可打印字符。这点不要混淆。

2、溢出
1)有符号
c1c2一样,我们以c1为例来说明。先看向上超过上界的情况:
十进制
十六进制
二进制

126
0000007e
0…0 0111 1110
126
127
0000007f
0…0 0111 1111
127
128
ffffff80
1…1 1000 0000
-128
129
ffffff81
1…1 1000 0001
-127
130
ffffff82
1…1 1000 0010
-126
注:0…0表示2401…1表示241

十进制
十六进制
二进制

-127
ffffff81
1…1 1000 0001
127
-128
ffffff80
1…1 1000 0000
-128
-129
0000007f
0…0 0111 1111
127
-130
0000007e
0…0 0111 1110
126
-131
0000007d
0…0 0111 1101
125
-256
00000000
0…0 0000 0000
0
-257
ffffffff
1…1 1111 1111
-1

从这两个表中可以看到,不管是否超过上下届也,不管是负数还是正数,每增加(减少)一个单位,就直接在二进制表示的最后一位上加(减)1
相加或相减时,都可以先不看前24位:如果倒数第8位变为1,则前面24位全部设置为1,该数被解释为负数;如果倒数第8位变为0,则前面24位全部设置为0,该数被解释为正数。下面我们挑几个例子详细说明:
c1=128;
这时,会在127的最后8位上加1,原来的8位是0111 1111,加1后,变为1000 0000,于是把前面24个位也全部变为1,且该数被表示为负数。其值为1*2^7+0=128.
c1=129;
128的最后8位是1000 0000,加上后为1000 0001,前面24位保持1不变。该数被解释为负数,其值为1*2^7+1=127.
c1=-129;
-128的最后8位是1000 0000,减去

我的更多文章

下载客户端阅读体验更佳

APP专享