姬世鹏 发表于 2019-12-3 22:55:46

关于大端和小端中的一个强制转化问题。

#include <stdio.h>

int main()
{
      int a = 0x1234;
      char *b = (char *)&a;//已知int 为4个字节,在这里进行强制转化为char 时,是否会溢出?然后把int 中的第一个字节中的两个16进制数传递给*b ?

      if (*b == 0x12)//在这里*b应该是字符型 ,为什么却和要和整形数据作比较?
      {
                printf("大端!\n");
      }
      else
      {
                printf("小端!\n");
      }

      return 0;
}
//这是一个小测试,结果如图。按照我的理解int的四个字节第一个传给char形,余下溢出传给m之后的地址中,但我经测试后结果却很奇怪,m之后的结果和我想的并不一样,同时结果显示的4我也很奇怪,为什么会这样?
#include <stdio.h>

int main()
{
        int i = 0x1234;
        char *m = (char *)&i;
        char *p = (char *)(m + 1);
               
        printf("%c\n", *m);//
        printf("%c\n", *(p - 1));//
        printf("%c\n", *p);//
       
        return 0;
}

jackz007 发表于 2019-12-3 22:55:47

本帖最后由 jackz007 于 2019-12-4 18:20 编辑

姬世鹏 发表于 2019-12-4 16:49
我其实想知道的是一个四字节的int形转化为一个字节的char形后,int中的数据会被怎么处理?

      整型数 0x12345678 内存中占用 4 个字节空间,对于 Little Endian 架构的机器而言,这 4 个字节在内存中的存储顺序是 78 56 34 12
      这一点,可以通过下面的程序进行证明:
#include <stdio.h>

int main()
{
      int i = 0x12345678                                                          ;
      char * m = (char *) & i                                                   ;
      printf("%02x %02x %02x %02x\n\n" , * m , *(m + 1) , * (m + 2) , * (m + 3));
}
      编译、运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
78 56 34 12


C:\Bin>

      正如你所见,根本就没有什么整型数到 char 型的转化,我们所做的,只是把构成这个整型数的 4 个 char (byte)按顺序显示出来了而已。

jackz007 发表于 2019-12-4 10:56:43

本帖最后由 jackz007 于 2019-12-4 10:59 编辑

      我想,你希望看到的应该是这个:
#include <stdio.h>

int main()
{
      union {
                char c = {0x12 , 0x34}                     ;
                intx                                        ;
      } d                                                   ;
      int i = 0x1234                                        ;
      char * m = (char *) & i                               ;
      if(d . x == 0x1234) printf("\tBig Endian machine.\n") ;
      else printf("\tLittle Endian machine.\n")             ;
      printf("\t%04x\n" , d . x)                            ;
      printf("\t%02x\n", * m)                               ;
      printf("\t%02x\n", * (m + 1))                         ;
      return 0                                              ;
}
      编译运行实况:
C:\Bin>g++ -static -o x x.c

C:\Bin>x
      Little Endian machine.
      3412
      34
      12

C:\Bin>
      把一个数显示成字符 ("%c") 那自然是什么也看不出来,但是,如果显示成十六进制数那就完全不同了。

姬世鹏 发表于 2019-12-4 16:49:35

jackz007 发表于 2019-12-4 10:56
我想,你希望看到的应该是这个:

      编译运行实况:


我其实想知道的是一个四字节的int形转化为一个字节的char形后,int中的数据会被怎么处理?

姬世鹏 发表于 2019-12-4 16:52:47

姬世鹏 发表于 2019-12-4 16:49
我其实想知道的是一个四字节的int形转化为一个字节的char形后,int中的数据会被怎么处理?

int 作为一个四字节的有符号类型,在其盛放不同长度的数值时,它的字节占用情况是怎样的?

姬世鹏 发表于 2019-12-4 21:39:35

jackz007 发表于 2019-12-4 18:17
整型数 0x12345678 内存中占用 4 个字节空间,对于 Little Endian 架构的机器而言,这 4 个字 ...

万般感谢
页: [1]
查看完整版本: 关于大端和小端中的一个强制转化问题。