2013-04-18 73 views
-1

我有以下几点:取与具有不同的位长度

void calculate(unsigned long num1, unsigned long num2){ 
    int32_t invertednum2 = ~(num2); // yields 4294967040 
    printf("%d\n", invertednum2);  // yields 255 

    // num1 is 3232236032 
    int32_t combine = (int32_t) num1 & num2; 
    printf("%d\n", combine);   // yields 0??? 
} 

我想和NUM1和NUM2,这样的结果将是:

000000000000000011111111 

我不知道如果我我正确地用两种不同的比特长度或者如果我应该投。

任何帮助,将不胜感激!

感谢

+1

1.使用'unsigned'整数类型。 2.你说你想要什么结果,但是你没有说出你的输入是什么。 (好吧,我们可以推断'num2'是什么,但我们不知道'num1'可能是什么。)目前还不清楚它的意图是什么。也许更多的例子会有帮助。 – jamesdlin 2013-04-18 06:24:56

+0

为什么使用int32_t而不是uint32_t? – 2013-04-18 06:25:22

+0

也许你不知道和AND的含义。你会得到正确的结果。 (我不知道为什么有人认为签名与无符号是相关的......结果将与uint32_t相同。) – 2013-04-18 06:30:16

回答

2

你不能在C中使用不同的位长,因为你不能在不同类型的操作数上应用任何二元运算符(shift)。如果您编写其中操作数为不同类型的代码,则C编译器在执行操作之前将首先将它们转换为相同类型(并且尺寸相同)。 C规范(第6.3节)中有7页专门讨论了这种情况的具体细节。

当你有一个结果:

int32_t combine = (int32_t) num1 & num2; 

num1num2unsigned long,这是64位,会发生什么是:

  1. 演员将截断num1到32位
  2. AND具有不同的操作数类型(int32_t和uint64_t),所以int32_t将符号扩展为64位。
  3. 的并在这些2个64位被执行值
  4. 的结果被截断回32位,并因为num1存储在combine

现在是3232236032(0xc0a80200),步骤1和2,将转换该到0xffffffffc0a80200,它将与num2进行与运算,然后这些最高32位将被丢弃。

相反,如果你有:

int32_t combine = (int32_t)(num1 & num2); 

它会做一个64位和num1num2,然后trunctate到32位combine存储。虽然这与第一种情况完全不同,但存储在combine中的结果值将完全相同 - 只有没有人看到的中间值(按位AND的结果)会不同。因此,编译器可以自由地重新排列这些事物,并为这两种情况生成完全相同的代码。

0

首先,你没有说什么num1是的,所以我们不知道结果是什么。其次,4294967040对于int32_t太大。由于你的论点是unsigned long,你的其他变量也应该是......但是然后使用%lu而不是%d

+0

感谢您的建议。我已经添加了num1。我试过unsigned long。 – 2013-04-18 16:21:58

相关问题