試圖在我創建的簡短內容中提取每個位元組。雖然我可以列印第二個(或第一個)位元組,但我不能同時列印。以我目前的理解,這應該可行。希望有人可以讓我清楚這里的錯誤是什么。我在 windows x86 上運行它,所以 ILP32 資料格式。
#include <iostream>
using namespace std;
int main()
{
short i = 0x1123;
short* p = &i;
short* p1 = p;
p1 ;
char c = *p;
char c1 = *p1;
cout
<< "Short: " << hex << i << '\n'
<< "p: " << p << '\n'
<< "p1: " << p1 << '\n'
<< "c: " << hex << (unsigned int)c << '\n'
<< "c1: " << hex << (unsigned int)c1 << '\n'
;
return 0;
}
Output:
Short: 1123
p: 0041FB58
p1: 0041FB56
c: 23
c1: ffffffcc
uj5u.com熱心網友回復:
這是修復:
#include <iostream>
#include <iomanip>
int main()
{
short i = 0x1123;
short* p = &i;
char* c = reinterpret_cast<char*>( p );
char* c1 = c 1;
std::cout << "Short: " << std::showbase << std::hex << i << '\n'
<< "p: " << p << '\n'
<< "c: " << ( *c ) << '\n'
<< "c1: " << ( *c1 ) << '\n';
return 0;
}
沒有必要p1。問題p1 在于它將 的值加了 2p1而不是像您期望的那樣加 1。那是因為p1是一個指標,short所以當你增加它時,它會前進 2(short是 2 個位元組)。您需要將其強制轉換為 a,char*以便每次增加它時,它都會將值加 1。
另外,請注意 中的 運算子 ( *c )。使用此運算子將確保不會*c將其列印為字符,而是作為其 ASCII 值或它具有的任何值列印,因此無需將其強制轉換為int.
可能的輸出:
Short: 0x1123
p: 0xb71f3ffd8e
c: 0x23
c1: 0x11
uj5u.com熱心網友回復:
一種不使用指標 trix 并且不關心位元組序的替代解決方案。
#include <iostream>
int main()
{
short i = 0x1123;
unsigned low = i % 256;
unsigned high = i / 256;
std::cout << std::hex
<< "Short: " << i << '\n'
<< "low: " << low << '\n'
<< "high: " << high << '\n';
return 0;
}
uj5u.com熱心網友回復:
感謝 rustyx 和 Pete Becker 回答了這個問題。程式知道該指標是用于 short 型別的,因此當我嘗試增加它時,它會自動將值增加 2。可以通過將指標轉換為 char 來規避此行為。
#include <iostream>
using namespace std;
int main()
{
short i = 0x1123;
cout
<< "Short: " << hex << i << '\n'
;
char* p = (char*)&i;
char c = *p;
cout
<< "p: " << hex << (unsigned int)p << '\n'
<< "c: " << hex << (unsigned int)c << '\n'
;
char* p1 = p 1;
char c1 = *p1;
cout
<< "p1: " << hex << (unsigned int)p1 << '\n'
<< "c1: " << hex << (unsigned int)c1 << '\n'
;
return 0;
}
Output:
Short: 1123
p: 54fd54
c: 23
p1: 54fd55
c1: 11
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/373548.html
