2011-12-22 80 views
3

所以我正在将一个char变为long,然后清除并重新执行。 15的变化使我的机器变得古怪,请参阅代码中的评论。你认为这是什么造成的?C位移位奇数结果过去15位移位左移

本机焦为0x00,并长期为0x0000 0000

unsigned char temp; 
    unsigned long open_code; 

    temp = 0x01; 
    open_code = open_code | (temp <<1);// open_code = 0x0000 0002 
    open_code = 0; 
    //......  
    // 2 - 7  
    //.... 
    temp = 0x01; 
    open_code = open_code | (temp <<8); // open_code = 0x0000 0100 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<9); // open_code = 0x0000 0200 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<10); // open_code = 0x0000 0400 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<11); // open_code = 0x0000 0800 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<12); // open_code = 0x0000 1000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<13); // open_code = 0x0000 2000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<14); // open_code = 0x0000 4000 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<15); // open_code = 0xFFFF 8000 !!!!! 
    open_code = 0; 
    temp = 0x01; 
    open_code = open_code | (temp <<16); // open_code = 0x0000 0000 !!!!! 
+0

你试图复制焦炭引入长,然后再转移呢? –

+0

对我来说完全“正常”。只是C的各种投射规则的交互(这通常是不可思议的)。 –

+0

你在哪个平台上? –

回答

2

它看起来像你的转移unsigned char太远,结果引发溢出。之前,尽量转移其强制转换为long,就像这样:

open_code = open_code | (((long)temp) <<15); 
+0

的偏差中描述。这种转变发生在临时内部吗?这就说得通了。 – eagletusk

+0

@ user2758:我不确定说这是否发生_inside_'temp'是准确的。其实,你可能是对的,我的回答可能是错的。你可能需要让'temp'成为一个更大的类型! –

+1

在移位运算符执行前,temp会被提升为int。这个问题可能与int被签署有关,但我还没有完全理解为什么。 –