Chinaunix首页 | 论坛 | 博客
  • 博客访问: 181068
  • 博文数量: 54
  • 博客积分: 1831
  • 博客等级: 上尉
  • 技术积分: 625
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-12 12:50
文章分类

全部博文(54)

文章存档

2009年(11)

2008年(43)

分类: C/C++

2008-09-05 18:39:04

在定义整数变量的型态的时候可以加上 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);

   就会自动做转换

阅读(1719) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~