C 如何掩盖';上半部分';长整型

C 如何掩盖';上半部分';长整型,c,C,我有一个关于在C中构造位掩码的问题。我需要屏蔽掉“long int”中最不重要的一半,这样我就只剩下上半部分了。我需要确保它屏蔽了一半,无论我是在64位还是32位平台上。我知道单词大小是在limits.h中定义的。最初我是这样做的: #define UPPER(X) ( X & ( ~0 << (__WORDSIZE/2) ) ) static inline int UPPER(long int x) { if (sizeof(long int) == 8) retur

我有一个关于在C中构造位掩码的问题。我需要屏蔽掉“long int”中最不重要的一半,这样我就只剩下上半部分了。我需要确保它屏蔽了一半,无论我是在64位还是32位平台上。我知道单词大小是在limits.h中定义的。最初我是这样做的:

#define UPPER(X) ( X & ( ~0 << (__WORDSIZE/2) ) )
static inline int UPPER(long int x) {
if (sizeof(long int) == 8)
  return x & 0xffffffff00000000;
else if (sizeof(long int) == 4)
  return x & 0xffff0000;
}

#定义上限(X)(X&(~0你拥有的是好的。持续传播将使
(~0崩溃),我建议你使用类似

#define UPPER(x) (x & (~0 << (sizeof(x) * 4)))
在编译时(因为它们都是常量),这意味着您不必担心任何性能问题

编辑:更正错误-sizeof以字节而不是位返回大小,因此我们必须乘以4(8/2)才能得到正确的结果。感谢那些指出这一点的人

编辑2:如果你真的想学究气,你可以使用

#define UPPER(x) (x & (~0 << (sizeof(x) * CHAR_BITS / 2)))

#定义上限(x)(x&(~0
#定义上限(x)((x))和(~0L我尽量不聪明。我会这样做:

#define UPPER(X) ( X & ( ~0 << (__WORDSIZE/2) ) )
static inline int UPPER(long int x) {
if (sizeof(long int) == 8)
  return x & 0xffffffff00000000;
else if (sizeof(long int) == 4)
  return x & 0xffff0000;
}

让编译器和优化器来完成这项工作,代码对任何未来的维护人员来说都是清晰的。如果将来支持36位处理器是一个问题,那么添加一个else子句来触发一些错误条件,这样你就可以在它出现时处理它。

酷。谢谢。这正是我所担心的,减少它的ops必须每次都要执行。这是错误的。sizeof()不会返回以位为单位的大小。请更正。我认为应该是“#定义上限(x)(x&(~0从技术上讲,您应该使用“#include”和字符位,以防代码在36位机器上运行。很抱歉挑剔:)但它仍然不是100%正确。sizeof以字符而不是字节返回大小。在大多数系统上都是相同的。但并不总是如此。正确的做法是使用sizeof(字符)/2而不是4。请注意,_字号在许多平台上都没有定义——在Solaris等平台上不可用。它甚至没有在Cygwin下定义。你的意思是屏蔽下半部分吗?你可能应该将第二个X放在parens中,这样如果你尝试执行上半部分,就不会得到有趣的操作顺序行为(foo | bar)或者某个long int可以是大于或等于4的任意字节数,因此为了真正的通用性,您将有无限多的情况,甚至忽略诸如具有非8位字节的机器之类的情况。当然,但这是最初的问题吗?在典型进程中,无符号long的大小不太可能不是4的倍数今天或不久的将来,处理器也不太可能没有8位字节,除非在一些非常特定的嵌入式应用程序中。因此,我会尽可能使代码清晰和简单。如果我在一个字节大小不寻常的处理器上工作,我希望会有相当大的努力移植其余的代码,并且is只是端口的另一项功能。您的代码将在具有32位长int的系统(如windows)上错误运行