Chinaunix首页 | 论坛 | 博客
  • 博客访问: 831219
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-20 10:57:33

因有人问及这个问题,故答之:
a << b 的类型取决于 a ,如果a类型所能表达的最大值小于等于int,则结果是int,否则为a的类型

比如 char << Type 的类型为 int,无论Type是char也好,long long也罢;
比如 unsigned char << Type 的类型为 int,虽然第一操作数为无符号类型,结果仍然是int,而不是unsigned int;
比如 long << Type 的类型为 long,因为按照标准 long 的表达范围 >= int 的表达范围;
比如 unsigned int << Type 的类型为 unsigned int,因为INT_MAX为2147483647,UINT_MAX为4294967295

右移的类型也同样如此,但右移后其左边是补充0还是补充1,取决于a是否小于0:
无符号数肯定是大于等于0的,右移后其左边肯定补充0
有符号数,且值大于等于0,那么右移后其左边也补充0
有符号数,且值小于0,那么右移后其左边“可能“补充1,之所以用“可能“二字,盖因为标准没有规定,但大部分编译器都这么做。

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

网友评论2012-11-20 10:58:19

phus
char作运算后的结果会转成int的.

网友评论2012-11-20 10:58:10

周星星
我用gcc作了一个小测试:
int main( void ) // 编译器选项中加了 -std=c99
{
    char a = 1;
    long long b = 1;
    printf( "%u\n", sizeof(a<<b) ); // 输出 4
    printf( "%u\n", sizeof(b) );    // 输出 8
}

网友评论2012-11-20 10:58:02

周星星
原文是:The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand.
分歧在于前一句话,到底是把两个操作数提升到同样的类型,还是在不足int时提升到int类型。