这是一种什么行为?

Flood1984 2005-09-09 04:11:13
BYTE a=255,b=1; //8bit
WORD c; //16bit
c=a+b; //C的值为多少?

我运算后知道为256,
也弄明白这是因为a和b都被提升为整型然后运算的.

我想知道的就是为什么char会被提升为int运算,
因为我总感觉两个数相加,如果他们的类型相同,则不需要提升,

我现在手头无书可查,所以肯请各位帮忙看看:
这种情况在标准C是怎么规定的?
那位大虾见到,请给出一句原话和出处,谢谢.

即这是下面的哪一种行为:
标准定义的,未指定行为,未定义行为,由实现定义的行为.
...全文
95 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
megaboy 2005-09-09
  • 打赏
  • 举报
回复
整型提升的目的是提高程序的运行效率,因为通常编译器的int长度定义为跟cpu的字长一样,让那些长度低于int的类型提升为int,让它们尽量符合cpu的字长,能够尽可能地进行优化,提高cpu处理的效率。

c89关于整型提升是这样描述的:

在一个表达式中,凡是可以使用整型的地方都可以使用带符号或无符号的字符、短整型或整形位字段,还可以使用枚举类型的对象。如果原始类型的所有值都可用int类型表示,则其值将被转换为int类型;否则将被转换为unsigned int类型。这一过程称为整型提升(integral promotion)。
Flood1984 2005-09-09
  • 打赏
  • 举报
回复
按:ALAN_1999(学习(PHP/HTML/JS/CSS)) 大侠所说,
那应该是标准定义的了。
从 whoho(在北方流浪) 所给的汇编来看,
应该也确实如此。
whoho 2005-09-09
  • 打赏
  • 举报
回复
C99是这么说的:
the "integer promotions" require that the abstract machine promote the value of each variable to int size and then add the two ints and truncate the sum.
看来你的程序的结果似乎是必然的

另外关于定义:
If an int can represent all values of the original type, the value is converted to an int;
otherwise, it is converted to an unsigned int. These are called the integer promotions.

我的疑问是,虽然C中也用了提升,但你程序中的a+b的结果类型似乎该是unsigned char,也就是BYTE,结果应该从100000000截断为00000000;至于为什么会出现256的结果,我怀疑是不是不同类型之间的赋值是一个标准未定行为(c=a+b)
whoho 2005-09-09
  • 打赏
  • 举报
回复
还是真的使用整形提升?
whoho 2005-09-09
  • 打赏
  • 举报
回复
这个回头我去查一下C标准,暂时得到的一个编译器的汇编码是这样的
movzx eax, BYTE PTR _a$[ebp]
movzx ecx, BYTE PTR _b$[ebp]
add eax, ecx
mov WORD PTR _c$[ebp], eax
从中可以看出,实际计算的时候都用了32位寄存器,当8位溢出的时候,
就在第9位上体现出来,然后将这个结果按16位搬回内存,所以,那个溢出位还存在
,计算结果就是256了

我觉得最可能的情形是:标准未定义,用意是让编译器去优化
ALAN_1999 2005-09-09
  • 打赏
  • 举报
回复
晕,发完了才看到,原来楼主是要大虾来回答,可惜我连小虾都还不是,不好意思了啊!
ALAN_1999 2005-09-09
  • 打赏
  • 举报
回复
c的不知,

c++是这样说的:在确定共同的目标提升类型之前,编译器将所有小于int 的整值类型上施加一个被称为整值提升的过程

在进行整值提升时,类型char,signed char,unsigned char和short int都被提升为类型int。如果机器上的int型足够表示所有unsigned short型的值(这通常发生在short用半个字表示,而int用一个字表示的情况下),则unsigned short int也被转换成int ,否则,它会被提升为unsigned int

c++primer P148

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧