鱼C论坛

 找回密码
 立即注册
查看: 1063|回复: 5

[已解决]关于大端和小端中的一个强制转化问题。

[复制链接]
发表于 2019-12-3 22:55:46 | 显示全部楼层 |阅读模式
7鱼币
#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;
}
最佳答案
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
        这一点,可以通过下面的程序进行证明:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int i = 0x12345678                                                          ;
  5.         char * m = (char *) & i                                                     ;
  6.         printf("%02x %02x %02x %02x\n\n" , * m , *(m + 1) , * (m + 2) , * (m + 3))  ;
  7. }
复制代码

        编译、运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 78 56 34 12


  4. C:\Bin>
复制代码


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

最佳答案

查看完整内容

整型数 0x12345678 内存中占用 4 个字节空间,对于 Little Endian 架构的机器而言,这 4 个字节在内存中的存储顺序是 78 56 34 12 这一点,可以通过下面的程序进行证明: 编译、运行实况: 正如你所见,根本就没有什么整型数到 char 型的转化,我们所做的,只是把构成这个整型数的 4 个 char (byte)按顺序显示出来了而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
        这一点,可以通过下面的程序进行证明:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int i = 0x12345678                                                          ;
  5.         char * m = (char *) & i                                                     ;
  6.         printf("%02x %02x %02x %02x\n\n" , * m , *(m + 1) , * (m + 2) , * (m + 3))  ;
  7. }
复制代码

        编译、运行实况:
  1. C:\Bin>g++ -o x x.c

  2. C:\Bin>x
  3. 78 56 34 12


  4. C:\Bin>
复制代码


        正如你所见,根本就没有什么整型数到 char 型的转化,我们所做的,只是把构成这个整型数的 4 个 char (byte)按顺序显示出来了而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-4 10:56:43 | 显示全部楼层
本帖最后由 jackz007 于 2019-12-4 10:59 编辑

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

  2. int main()
  3. {
  4.         union {
  5.                 char c[2] = {0x12 , 0x34}                     ;
  6.                 int  x                                        ;
  7.         } d                                                   ;
  8.         int i = 0x1234                                        ;
  9.         char * m = (char *) & i                               ;
  10.         if(d . x == 0x1234) printf("\tBig Endian machine.\n") ;
  11.         else printf("\tLittle Endian machine.\n")             ;
  12.         printf("\t%04x\n" , d . x)                            ;
  13.         printf("\t%02x\n", * m)                               ;
  14.         printf("\t%02x\n", * (m + 1))                         ;
  15.         return 0                                              ;
  16. }
复制代码

        编译运行实况:
  1. C:\Bin>g++ -static -o x x.c

  2. C:\Bin>x
  3.         Little Endian machine.
  4.         3412
  5.         34
  6.         12

  7. C:\Bin>
复制代码

        把一个数显示成字符 ("%c") 那自然是什么也看不出来,但是,如果显示成十六进制数那就完全不同了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-4 16:49:35 | 显示全部楼层
jackz007 发表于 2019-12-4 10:56
我想,你希望看到的应该是这个:

        编译运行实况:

我其实想知道的是一个四字节的int形转化为一个字节的char形后,int中的数据会被怎么处理?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

int 作为一个四字节的有符号类型,在其盛放不同长度的数值时,它的字节占用情况是怎样的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-4 21:39:35 | 显示全部楼层
jackz007 发表于 2019-12-4 18:17
整型数 0x12345678 内存中占用 4 个字节空间,对于 Little Endian 架构的机器而言,这 4 个字 ...

万般感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 12:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表