3

マシンのエンディアンをチェックするための C++ コードを設計しました。それはうまくいきます。ただし、各バイトの内容を 4 バイトの int で出力することはできません。

#include<iostream>
using namespace std;
bool f()
{
    int a = 1;
    char *p = (char*)&a;
    for (int i = 0 ; i < 4 ; ++i)
            cout << "p[" << i << "] is " << hex << *p++ << "   ";
    cout << endl ;
    p -= 4;
    if (*p == 1) return true ; // it is little endian
    else return false;  // it is big endian
}

int main()
{
    cout << "it is little endian ? " << f() << endl ;
    return 0 ;
}

出力:

 p[0] is    p[1] is    p[2] is    p[3] is
 it is little endian ? 1

出力が空なのはなぜですか?

ありがとう

4

3 に答える 3

3

問題は、のタイプが*pcharあるため、ストリームはその値をASCII文字(表示されている文字の値ではない可能性が高い)として出力しようとすることです。あなたがそれをにキャストすると、intあなたはあなたが期待するものを手に入れるでしょう:

cout << "p[" << i << "] is " << hex << static_cast<int>(*p++) << "   ";
于 2012-06-09T04:31:15.853 に答える
0

次のようにコーディングして、int 配列のすべてのバイトを出力しました。各 int の長さは 4 バイトでした。これが何らかの形で役立つことを願っています。

#include <iostream>
#include<math.h>
#include<string.h>
using namespace std;


int main()
{
    int length = 5;
    unsigned int* array = new unsigned int[length];
    for(int i=0; i<length; i++)
        array[i] = 16843009;
    for(int i=0;i<=4;i++)
    {
    int new_dividend=0,k=0,l=0;
        double bytevalue=0;
        int bits[32];
        int number=array[i];
        //Initializing
        for(int c=0;c<=31;c++)
        {
            bits[c]=0;
        }
        //convert to binary
        while(number!=1)
        {
            new_dividend=number/2;
            bits[k]=number%2;
            number=new_dividend;
            k++;
            }
        bits[k]=1;
        //Pad with zero if needed
        if(k!=31)
        {
            for(int ctr=k+1;ctr<=31;ctr++)
            {
                bits[ctr]=0;
            }
        }

    for(int counter=0;counter<=31;counter++)
{
    //Print value of each byte.Also Reset values after each bytevalue has been printed.
    if(l==8)
    {
        l=0;
        cout<<bytevalue;
        bytevalue=0;
    }
    //calculate value of each byte
    bytevalue=bytevalue+(pow(double(2),l))*bits[counter];
    ++l;
}
    if(l==8)
    {cout<<bytevalue;
    }
    }
     delete[] array;

    return 0;
}

期待される出力 = 11111111111111111111 の配列 [i] = 16843009 ここで、i は任意の範囲です。

于 2013-06-29T08:21:31.483 に答える
0

提案されたprintfは問題ありませんが、代わりにシフト演算子<<、>>を使用してintの個々のバイトを調査することもできます。

于 2012-06-09T07:12:26.057 に答える