|
发表于 2012-9-25 08:37:08
|
显示全部楼层
本帖最后由 uc_c++ 于 2012-9-25 09:20 编辑
Wxy8030 发表于 2012-9-24 21:21
本帖最后由 uc_c++ 于 2012-9-24 17:53 编辑
以下答题假定int是16位,char是8位,long是32位:
unsigned char x=0xff;
~x //结果是多少?
答:0x00,跟KEIL模拟结果一样
-----------------------------------------------------------------------------------
正确结果是(int)0xFF00;
char没有~运算能力,运算先先会被提升至int.
~x相当于~((int)x)
KEIL C51这里并没有遵守C标准。
http://www.amobbs.com/thread-4582991-1-1.html
unsigned char a=255;
unsigned char b=1;
int c=a+b; //结果为多少?
答:0x100,跟KEIL模拟结果一样
-----------------------------------------------------------------------------------
正确。
unsigned char没有+运算能力,运算之前先提升至int
a+b相当于((int)a+(int)b)
结果是(int)0x100
unsigned int a=65535;
unsigned int b=1;
long int c=a+b; //结果为多少?
答:0x10000,跟KEIL模拟结果不一样,KEIL里结果为 0x00000
----------------------------------------------------------------------------------------
为什么结果为0,而是不是0x10000呢?
先看a+b,
a是unsigned int,b也是unsigned int,
unsigned int与unsigned int运算不需要提升,也不需要类型转换,结果仍然是unsigned int
a+b相当于(unsigned int)(a+b)
c=a+b
相当于c=(long)((unsigned int)(a+b))
结果当然为0。
int a,b;
unsigned char i=1;
signed char j=-1;
unsigned int k=1;
signed int l=-1;
a=(i>j); //结果为多少?
b=(k>l); //结果为多少?
这个没研究,因为我不会这么写程序
-----------------------------------------------------------
这里要强调,char不仅没有+-*/ & | ~运算,< > >= <=也运算也没有。
要进行比较运算,也必须要首先提升。
(i>j)
i是unsigned char,j是signed char
比较前先提升至int
(i>j)相当于((int)i>(int)j,结果为真。
而(k<l)
k是unsigned intr,j是signed int
unsigned int与signed int进行运算,signed int首先转换成unsigned int
(k<l) 相当于 (k<(unsigned int)l),结果为假。
|
|