c语言signed的例子,C语言的补码表示和unsigned及signed的的转换

这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想。

C语言的基本类型有char、int、float、double,另外还有说明符long、short、signed和unsigned。

首先要注意在不同操作系统中类型大小不一样,下面的情况只是考虑其中一种情况。

int和char均默认为signed,二进制的最高一位来表示符号,0为正1为负。

假如short int是16位,由于第1位表示正负,所以只剩15位表示实际数值,范围为-2^15到2^15-1

举例,按照原码表示:

0000 0000 0000 0101表示5

1000 0000 0000 0101表示-5

反码就是符号位不变,数值位取反,比如5就表示为0111 1111 1111 1010

但是这样问题来了,1000 0000 0000 0000跟0000 0000 0000 0000表示的都是0,这样0就有2种编码方式。

所以C语言采取了补码表示,1000 0000 0000 0000表示的是-2^15而非0。

补码:1、对于正数,补码与原码相同;2、对于负数,数值位的绝对值取反后在最低位加1。

因此,C语言中是用表示-5的是1111 1111 1111 1011

那么对负整数逐次进行自加运算得到结果如下

-4  1111 1111 1111 1100

-3  1111 1111 1111 1101

-2  1111 1111 1111 1110

-1  1111 1111 1111 1111

于是-1再自加后所有位数全部变为0,0的表示形式就变成了0000 0000 0000 0000,表示0的只有一种形式。

char在计算机内部是用一个字节的二进制来表示的,这里假定默认为signed,表示范围为-128到127。

对于char c = 128; c的二进制表示为1000 0000,如果转换成int输出是-127。

char转换成short int并不是说位数增加了,而是把它当成short int来解释,因此c还是1000 0000,表示的是-127,而不会因为转型为int就变成了0000 0000 1000 0000

看下面一段代码,signed转unsigned

int _tmain(int argc, _TCHAR* argv[])

{

char c = 128;

unsigned char cu = c;

short int i = cu;

cout << i;

return 0;

}

把c转换成unsigned char后,再转换成short int,那么输出的就是128,转型后还是1000 0000,但是按照unsigned的解释,最高位不再是符号位,而是数值位,所以结果就是2^8=128。

好了,再看下面一段代码,unsigned转signed

int _tmain(int argc, _TCHAR* argv[])

{

unsigned char cu = 255;

char c = cu;

short int i = c;

cout << i;

return 0;

}

255的unsigned表示为 1111 1111,转换为signed后,符号位1代表是负数,数值位转换成十进制后是127,按照补码的定义结果为-1。

以前用OpenCV处理图像时,经常被绕住,因为IplImage*的ImageData是char表示的,而处理图像时一般都转化成了unsigned char,回顾了补码的概念后那么下面这个对应就好理解了。

数值区间

[0,127]

[-128,-1]

char

x

x

unsigned char

x

256+x

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值