unsigned 和 signed之间的转换关系

在定义整数变量的型态的时候可以加上 unsigned 或是 signed, 例如

 

unsigned char

 

unsigned short (int)

 

unsigned long (int)

 

unsigned int

 

----------

 

signed char

 

signed short (int)

 

signed long (int)

 

signed int

 

--------------

 

上面 signed 有加和没有加是一样的意义

 

加上 unsigned 以后,

 

 

 

1. 所需要的数据储存空间和没有加 unsigned 时是一样的

 

2. 在使用 printf() 打印时基本上你必须分清楚

 

   unsigned 有影响到的是参数的传递, 使用 %d 或是

 

   %u 基本上是看程序设计者自己的选择

 

   int i=-1;

 

   printf("%d %u/n", i, i);

 

   会印出

 

   -1 4294967295

 

 

 

   unsigned int i=-1;

 

   printf("%d %u/n", i, i);

 

   也会印出

 

   -1 4294967295

 

 

 

   char i=-1;

 

   printf("%d %u/n", i, i);

 

 

 

   还是会印出

 

   -1 4294967295

 

 

 

   但是

 

   unsigned char i=-1;

 

   printf("%d %u/n", i, i);

 

   则会印出

 

   255 255

 

   这不是 %d %u 的问题, 而是

 

   参数传递时数据转换的问题 (见下面第 3 )

 

 

 

不一样的地方有下面几个

 

 

 

1. 数据的范围基本上加上 unsigned 以后会变成 2

 

 

 

2. 程序里比较大小的时候

 

 

 

   int i=1;

 

   int j=-1;

 

   if (i>j) printf("i>j/n");

 

   else printf("i<=j/n");

 

   你会发现结果是 i>j

 

 

 

   unsigned int i=1;

 

   int j=-1;

 

   if (i>j) printf("i>j/n");

 

   else printf("i<=j/n");

 

   你会发现结果是 i<=j

 

 

 

   也就是说 signed unsigned 在比较的时候 compiler

 

   会把 signed int 自动当成 unsigned int 来比较

 

 

 

2. 数据转换的时候 (或是函式呼叫的时候)

 

   char i = -128;

 

   int j = i;

 

   变量 i 里面的数据只有 1 个字节, 要放进

 

   变量 j 里面的时候需要做 sign extension

 

   也就是多出来的 3 个字节 (24 bit) 都要

 

   填入原来 i sign bit ( 8 bit)

 

   以上例来说 (用二进制表示)

 

   i: 10000000

 

   j: 11111111 11111111 11111111 10000000

 

 

 

   unsigned char i = -128;

 

   int j = i;

 

   unsigned 转为 signed 时前面一率补 0

 

   用二进制表示

 

   i: 10000000

 

   j: 00000000 00000000 00000000 10000000

 

 

 

   char i = -128;

 

   unsigned int j = i;

 

   还是做 sign extension

 

   用二进制表示

 

   i: 10000000

 

   j: 11111111 11111111 11111111 10000000

 

 

 

   函式呼叫的时候会做型态的转变, 例如

 

   void fun(int x)

 

   {

 

     ...

 

   }

 

   呼叫时如果用

 

   unsigned char i=-1;

 

   fun(i);

 

   就会自动做转换

 

 

 

小结:

以下均针对VC++6.0编译器

1、  char unsigned char (1字节)

char c = 0x90 (1001 0000)首位是1

c >>= 4

c = 0xF9

 

char c = 0x70 (0111 0000) 首位是0

c >>= 4

c = 0x07

 

char c = 0x90 (1001 0000)与首位无关

c <<= 4

c = 0x00

 

char c = 0x70 (0111 0000) 与首位无关

c <<= 4

c = 0x00

 

2、  int unsigned int (4字节)

int I = 0xF0 00 11 11 (11110000 00000000 00010001 00010001)首位1

I >>= 4

I = 0xFF 00 01 11

 

int I = 0x00 00 11 11 (00000000 00000000 00010001 00010001)首位0

I >> 4

I = 0x00 00 01 11

 

unsigned int I = 0xF0 00 11 11 (11110000 00000000 00010001 00010001)与首位无关

I << 4

I = 0x00 01 11 10

 

unsigned int I = 0x00 00 11 11 (00000000 00000000 00010001 00010001)与首位无关

I << 4

I = 0x00 01 11 10

 

3、  char int

char c = 0x90 (首位是1)

int I = 0

I = c

I = 0xFF FF FF 90

 

char c = 0x70 (首位是0)

int I = 0

I = c

I = 0x00 00 00 70

 

4、  char unsigned int

char c = 0x90 (首位是1)

unsigned int I = 0

I = c

I = 0xFF FF FF 90

 

char c = 0x70 (首位是0)

unsigned int I = 0

I = c

I = 0x00 00 00 70

 

 

5、  unsigned char int

unsigned char c = 0x90 (与首位无关)

int I = 0

I = c

I = 0x00 00 00 90

 

unsigned char c = 0x70 (与首位无关)

int I = 0

I = c

I = 0x00 00 00 70

 

6、  unsigned char unsigned int

unsigned char c = 0x90 (与首位无关)

int I = 0

I = c

I = 0x00 00 00 90

 

unsigned char c = 0x70 (与首位无关)

int I = 0

I = c

I = 0x00 00 00 70

 

总结:unsigned(无符号)不管左移,还是右移,均补0signed(有符号)左移补0,右移补(如果首位是1,补1;首位是0,补0)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值