2012-12-18 43 views
3

我有一个unsigned long long变量,它是我的系统上8个字节,我尝试做以下上:左移错误

unsigned long long ull; 
ull = timeLow; 
ull |= timeHigh << 32; 

我得到的警告:类型的左移计数> =宽度当这样做。此外,它似乎没有考虑到时间高涨转移。我该如何解决这个问题?

+0

为什么系统是这样的(硬件/操作系统/编译器)?任何不使用uint64_t的原因? – Michael

+0

尝试'ull | = timeHigh << 32ull;'注意数字后缀。 –

+1

@ThomasMatthews:没有帮助,因为'<<'不执行通常的算术转换;左操作数(在默认促销后)必须足够大。 – aschepler

回答

10

您没有移动ull,您正在移动timeHigh,然后将该移位的结果存储在ull中。

我怀疑timeHigh不足以存储32位转换的结果。使timeHighunsigned long long,(编辑)或者可选地仅将timeHigh分配给ull,然后在timeLow之前将or移位。 (credit @JasonD)

+2

或者只是先分配timeHigh给ull,然后在timeLow之前将其转移。 – JasonD

0

timeHigh似乎是一个32位的类型。在移位32位后,它全部为零。您必须在转换之前将timeHigh转换为很长的类型。

unsigned long long ull; 
ull = timeHigh; 
ull = ull << 32; 
ull |= timeLow; 
+0

将32位无符号数左移32位会导致未定义行为,不一定为“全零”。 – aschepler

+0

我描述了在他的特殊情况下可能发生的事情,“它似乎没有考虑到时间高涨”。你是对的,我应该提到这个标准。 – stefan

0

这是你的意思吗?

unsigned long long timeLow = /* value */; 
unsigned long long timeHigh = /* value */; 
unsigned long long ull; 
ull = (timeHigh << 32 | timeLow)