2011-05-08 125 views
3

我乘以0x1d400 * 0xE070381D抓取一個8字節字的高4字節

當我這樣做對我的計算結果是0x00019A4D26950400

當我試圖在CPP實施這一這裏就是我有。

long long d; 

d = 3765450781 * 1d400; 

該代碼給出的結果是d = 0x26950400。 這只是底部的4個字節,其他一切發生了什麼?

我想隔離上面的4個字節0x00019A4D並將它們保存到另一個變量中。如何才能做到這一點?

如果我能得到的乘積來顯示所有8個字節我在想什麼做隔離上的4個字節的是:

d = d & 0xFF00; //0xFF00 == (binary) 1111111100000000 

d = d>>8; 

將這項工作?

+0

您使用的是什麼操作系統和編譯器? – 2011-05-08 01:11:02

+0

你想要16個字節還是8個字節?你的計算器結果顯示16個十六進制數字,它是8個字節,而不是16個。 – 2011-05-08 01:18:06

+0

我認爲他想要8個字節,但是計算了16個數字。我編輯了相應的問題 – hirschhornsalz 2011-05-08 01:26:17

回答

6

(例如3765450781LL)否則它們被計算爲int s,並且其餘部分被分配給d之前切掉後的數字添加LL

+0

根據您的編譯器,3765450781(不帶'LL')可能是'int'之外的另一種類型。不能保證32767以上的數字符合'int'。特別是在許多合理的系統中,它將是一個'unsigned int'。 – MSalters 2011-05-09 09:34:39

5

您需要在long long的常數後面使用LL,如MByD的另一個答案所示。

另外,你的數據類型應該是unsigned long long。在右移時,由於符號擴展,您可能會重複最左邊的位。 (這是機器相關的,但大多數機器簽名在右移時擴展負數)。

在右移之前,您不需要屏蔽掉高4字節,因爲您要扔掉低4字節當你做正確的轉變時。

最後,請注意>>的參數是的位數,而不是字節。因此,你要

d = d >> 32; 

這也可以寫成

d >>= 32; 
+0

他想要>> 32,因爲他只想要高4個字節而不是8 – hirschhornsalz 2011-05-08 01:27:44

+0

@drhirsch是的,我剛剛意識到這一點。謝謝。只是在考慮位數的變化,並忘記長期只有64位。 – 2011-05-08 01:28:25

1

正如有人指出,你必須用LL後綴您的64位數字文字。

要打印long long變量以十六進制,使用格式說明"%016llX"

long long d; 
d = 3765450781LL * 0x1d400LL; 
printf("%016llX\n", d); 

輸出00019A4D26950400

爲了得到變量d的上,下32位(4個字節),你可以這樣做:

unsigned int upper; 
unsigned int lower; 

upper = d >> 32; 
lower = d & 0x00000000FFFFFFFF; 

printf("upper: %08X lower: %08X\n", upper, lower); 
相關問題