取与具有不同的位长度
我有以下几点:取与具有不同的位长度
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
我不知道如果我我正确地用两种不同的比特长度或者如果我应该投。
任何帮助,将不胜感激!
感谢
你不能在C中使用不同的位长,因为你不能在不同类型的操作数上应用任何二元运算符(shift)。如果您编写其中操作数为不同类型的代码,则C编译器在执行操作之前将首先将它们转换为相同类型(并且尺寸相同)。 C规范(第6.3节)中有7页专门讨论了这种情况的具体细节。
当你有一个结果:
int32_t combine = (int32_t) num1 & num2;
和num1
和num2
都unsigned long
,这是64位,会发生什么是:
- 演员将截断
num1
到32位 - AND具有不同的操作数类型(int32_t和uint64_t),所以int32_t将符号扩展为64位。
- 的并在这些2个64位被执行值
- 的结果被截断回32位,并因为
num1
存储在combine
现在是3232236032(0xc0a80200),步骤1和2,将转换该到0xffffffffc0a80200,它将与num2进行与运算,然后这些最高32位将被丢弃。
相反,如果你有:
int32_t combine = (int32_t)(num1 & num2);
它会做一个64位和num1
和num2
,然后trunctate到32位combine
存储。虽然这与第一种情况完全不同,但存储在combine
中的结果值将完全相同 - 只有没有人看到的中间值(按位AND的结果)会不同。因此,编译器可以*地重新排列这些事物,并为这两种情况生成完全相同的代码。
首先,你没有说什么num1
是的,所以我们不知道结果是什么。其次,4294967040对于int32_t
太大。由于你的论点是unsigned long
,你的其他变量也应该是......但是然后使用%lu
而不是%d
。
感谢您的建议。我已经添加了num1。我试过unsigned long。 – 2013-04-18 16:21:58
1.使用'unsigned'整数类型。 2.你说你想要什么结果,但是你没有说出你的输入是什么。 (好吧,我们可以推断'num2'是什么,但我们不知道'num1'可能是什么。)目前还不清楚它的意图是什么。也许更多的例子会有帮助。 – jamesdlin 2013-04-18 06:24:56
为什么使用int32_t而不是uint32_t? – 2013-04-18 06:25:22
也许你不知道和AND的含义。你会得到正确的结果。 (我不知道为什么有人认为签名与无符号是相关的......结果将与uint32_t相同。) – 2013-04-18 06:30:16