2012-10-01 35 views
3

我正在研究一个将64位(用于某些计算)和32位(用于节省空间的存储)无符号整数混合的程序,所以这是非常重要的,算术避免溢出移位和算术中的位宽度C

下面是一个例子问题

我想位移位1的unsigned N久的离开了,但是我想要的结果是为unsigned long long。这将在if语句中的比较操作中使用,因此不会进行任务分配。我会给你一些代码。

void example(unsigned long shift, unsigned long long compare) 
{ 
    if((1<<shift)>compare) 
    { 
     do_stuff; 
    } 
} 

我怀疑这不会做我想做的事,那么下面做我想做的事?

void example(unsigned long shift, unsigned long long compare) 
{ 
    if(((unsigned long long)1<<shift)>compare) 
    { 
     do_stuff; 
    } 
} 

如何对这些东西的位宽进行微操作?哪一个操作数决定了操作执行的位宽,还是两者中的较大者?

另外,我想运行的是如何工作的其它操作太多,如果可能的话,比如+ * /%等

或许与此信息资源的引用将是很好了,我不能似乎在任何地方都能清楚地找到这些信息。或者规则很简单,只需发布​​即可。我不确定。

+2

'如果((1 <比较)'这将无法在大多数商店代码审查使用的空间,让您的代码可读性 –

+1

“我怀疑这会不会做我想做的。” - 而不是怀疑,为什么不a)阅读你的语言标准或手册,并b)尝试它?我看起来很好。 “如果可能的话,我希望尽可能减少其他操作的效果,例如+ * /%等。” - 同样的答案。在互联网之前,人们阅读书籍。 –

回答

4

哪个操作数确定的比特宽度,该操作与执行,或者是它的两个较大的:然而,这可能仅通过使用long long类型的常量来实现(在该特定情况下) ?

对于位移,它是左操作数(要移位的那个),它决定了操作的执行类型。如果整数提升将其转换为intunsigned int,则该操作在该类型上执行,否则在左操作数的类型上执行。

为了进行比较,可以将转换结果转换为另一个操作数的类型。在您的示例代码中,整数常量1的类型为int,因此该转换将在int类型中执行,并将结果转换为unsigned long long进行比较。投射作品,因为结果的类型不会因整数促销而改变,如使用后缀文字1ull

对于所列的其它操作,算术运算(作为比较),在其通过两个操作数来确定执行操作如下类型:

否则,整数提升上都执行操作数。然后下面的规则被施加到推动操作数:

  • 如果两个操作数具有相同的类型,则不需要进一步的转化。
  • 否则,如果两个操作数已签署整数类型或两者都具有的无符号整数类型,具有较小整数转换等级的类型的操作数转换为操作数的具有更大的秩的类型。
  • 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,然后用带符号的整数类型的操作数被转换成无符号整数类型的操作数的类型。
  • 否则,如果用符号整型操作数的类型,可以表示所有与无符号整数类型的操作数的类型的值,则与无符号整数类型的操作数转换为操作数的类型与符号整数类型。
  • 否则,两个操作数转换为对应于与符号整型操作数的类型的无符号整数类型。
+0

是的,谢谢。非常清晰和爽快地没有居高临下的评论! –

+0

@BigEndian也没有隐藏的人身攻击。 –

+0

这是一个有点明显的被称为“含蓄”,而是采取了点。一只眼睛的眼睛会让整个世界变得盲目。 并记录在案,你没让我想到把空间在我的代码。 –

3

你想要的是一个long long文字。为此,请使用1LL而不是1

+0

'1LL'和'(long long)1'没有区别。 –

4

它会做你想要的。 1LL