Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11239
  • 博文数量: 5
  • 博客积分: 150
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-22 23:21
文章分类

全部博文(5)

文章存档

2012年(3)

2011年(2)

我的朋友
最近访客

分类: C/C++

2012-04-15 21:32:47

转载地址:
http://hi.baidu.com/maydaygmail/blog/item/7237a454f993ce4a1138c2e0.html/cmtid/b4b3df41bc460d30869473f6

代码如下:

unsigned int a;
char b = 0xff;
a = b;
printf("a: %d\n", a);
程序运行结果: a: -1

分析:

一、

a是0xff,也就是二进制数11111111。
b比a宽,a是有符号数,赋值时先要做符号位扩展。
如果unsigned int是32位数,则扩展后为32个1。
你用打印符%d打印,结果当然是-1。
如果unsigned int是16位数,则扩展后为16个1。
你用打印符%d打印,结果仍然是-1。
这题与数4294967295无关,也就是与int宽度无关,结果总是-1。

楼主的疑问:“a的数据类型是无符号的,取值范围应是从0开始的,怎么也能存储负数呢”?
有符号数和无符号数,在机器里是一模一样,看不出来的。你当它是有符号数,它就是有符号数;你当它是无符号数,它就是无符号数。

 

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

   就会自动做转换

 

////////////////////////////////////////////////////////////////////////////////////

int 和unsigned int 的关系

 

int i = -1;
 unsigned int j = 2;
 string s=i>j? "i>j":"i cout<< s<j(因为int 和 unsigned int之间进行比较或者算术运算时,int 转换为unsigned int,

int i =-1在机器中存储为 11111111 11111111 11111111  11111111,此数直接转换为unsigned,此时最高位不是符号位,此时i值是unsigned int 所能表示的最大值)

cout<

 

i+j对应的过程如下所示:

 

unsigned int  j = i;
 cout<
 cout<

阅读(3653) | 评论(0) | 转发(0) |
0

上一篇:关于string::npos

下一篇:关于bitmap算法

给主人留下些什么吧!~~