一路阿里巴巴笔试题,用1、2、3 三个数字组成一个最大的数

一道阿里巴巴笔试题,用1、2、3 三个数字组成一个最大的数
题目如下:
给你1、2、3 这三个数字 可以使用C的各种运算符 你能表示的最大的整数是()

A、2*3*sizeof(1)            
B、3<<(2<<sizeof(1))                    
C、sizeof(3)<<(sizeof(2)<<(sizeof(1)))                   
D、(unsigned long)(2-3)*1

答案是D,可是我算了一下C比D还大啊?
假设是32位机,那么
C:sizeof(3)<<(sizeof(2)<<(sizeof(1))) = 4<<(4<<4) = 4<<(4*2^4)=4<<64=4*2^64=2^66
D:(unsigned long)(-1) = 11111111 11111111 11111111 11111111 =2^32-1

为什么答案是D?求大神解答~
------解决思路----------------------
C答案应该发生数据溢出了吧?在我这里,32位,显示为464.
------解决思路----------------------
你觉得32位的机子,能够进行66位的移位运算?移到31时早就溢出了。
------解决思路----------------------
4<<30的时候就已经为0了。然后你再怎么左移都为0
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

因为  << 超过有效位数 是未定义行为 表达式是错误的  结果没价值 
而选项D得到的是 unsigned long类型能表示的最大值

谢谢,补充一下,超过有效位数结果是0
错的
超过有效位数 是未定义行为
未定义行为没有所谓的结果 
0 只是一个无关紧要的巧合 没有价值 

噢噢,你是说这是一种未定义行为,不合法的,结果是不能确定的吗?
我的理解是,移位的意思不就是  将所有的位移n位,空出的位用0填充 吗?那么移动超过32位不就是都是0了么,所以最后结果是0也是有道理的
然而 你的理解并没有什么卵用