11

The below program tests for Little/Big endian on intel processor. Actually little endian is correct output. First I am casting int to char* and accessing its value without initialization to int *.I am not understanding second part of output. Here int pointer is casted to char *. So why is not int pointer not changed its alignment to char *?

00000000 00000000 00000011 01111111 = 895
0        0         3       127

int main() {
    int num = 895;
    if(*(char *)&num == 127)
    {
        printf("\nLittle-Endian\n");
    }
    else
    {
        printf("Big-Endian\n");
    }

    int *p = (char *)&num ;
    if(*p == 127)
    {
        printf("\nLittle-Endian\n");
    }
    else
    {
        printf("Big-Endian\n");
    }
    printf("%d\n",*p);
}

o/p

Little-Endian
Big-Endian
895
4

2 に答える 2

6
  1. The first half of your program using this comparison:

    if(*(char *)&num == 127)
    

    looks fine.

  2. プログラムの後半には、次の割り当てが含まれています。

    int *p = (char *)&num ;
    

    これは有効なコードではありません。明示的なキャストなしでポインタ型を変換することはできません。この場合、コンパイラはそれを回避できる可能性がありますが、厳密に言えば、それは正しくありません。この行は次のようになります。

    int *p = (int *)(char *)#
    

    または単にこの同等のステートメント:

    int *p = #
    

    この例から、2番目のテストが希望どおりに機能しない理由がわかると確信していますint。関心のある1バイトではなく、全体を操作していることになります。pchar *それはあなたが期待したように動作します:

    char *p = (char *)#
    
于 2013-01-26T19:57:04.773 に答える
2

Can int pointer be cast to char *?

Yes, it's only the inverse that would invoke undefined behavior, more precisely, using the result of a cast from char * to int * (since char is 1-byte aligned, so any data pointer type can safely be cast to char *).

于 2013-01-26T19:55:42.283 に答える