鱼C论坛

 找回密码
 立即注册
查看: 879|回复: 7

[已解决]C语言强制转化指针类型的问题

[复制链接]
发表于 2020-12-4 13:59:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想把一个int类型的4个字节中的高4位和低4位分别输出。所以弄了个char类型的指针指向这个数,想依次输出4个字节的高4位和低4位。但是找不出下面代码有什么逻辑bug
#include <stdio.h>

int main()
{
        long i;
        int j;
        int array1[4],array2[4];
        printf("请输入i\n");
        scanf("%d",&i);
        char *p=(char *)&i;
        for(j=0;j<4;j++)        {
                array1[j]=(*(p+j)>>4);
        }
        for(j=0;j<4;j++)
        {
                array2[j]=((*(p+j)<<4)>>4);
        }
        printf("高四位分别是:\n");
        for(j=0;j<4;j++)
        {
                printf("%x ",array1[j]);
        }
        printf("\n低四位分别是:\n");
        for(j=0;j<4;j++)
        {
                printf("%x ",array2[j]);
        }
        return 0;
}
最佳答案
2020-12-4 16:21:07
int main()
{
        long i;
        int j;
        int array1[4], array2[4];
        printf("请输入i\n");
        scanf("%d", &i);
        char *p = (char *)&i;
        for (j = 0; j<4; j++)
        {
                printf("%x ", (p[j]&0xff));
        }

        return 0;
}
这样可以直接输出int型的4个字节,但是你的要求是高四位,第四位,需要再把字节开成两个16进制位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-4 14:52:01 | 显示全部楼层
int main()
{
        long i;
        int j;
        int array1[4] = { 0 }, array2[4] = {0};

        printf("请输入i\n");
        scanf("%d", &i);
        char p[8] = {0};
        for (j = 0; j<4; j++)        {
                array1[j] = ((i>>(j*4)) & 0xf);
        }
        for (j = 0; j<4; j++)
        {
                array2[j] = (((i >> ((4+j)*4))) & 0xf);
        }
        printf("高四位分别是:\n");
        for (j = 3; j>=0; j--)
        {
                printf("%x ", array2[j]);
        }
        printf("\n低四位分别是:\n");
        for (j = 3; j >= 0; j--)
        {
                printf("%x ", array1[j]);
        }
        return 0;
}

这个感觉没有必要强转 ,直接对int型进行操作就行我改了下你看行不
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 16:02:35 | 显示全部楼层
北冰羊 发表于 2020-12-4 14:52
int main()
{
        long i;


我感觉你的逻辑也有点不对,你输入一个四位数看看运行正确没。我觉得改成 array1[j] = ((i>>(j*8)) & 0xf);
array2[j] = (((i >> (4+j*8))) & 0xf);
这样就可以,不过我想熟悉指针的操作,想用指针来做
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 16:10:02 | 显示全部楼层
取什么名字好… 发表于 2020-12-4 16:02
我感觉你的逻辑也有点不对,你输入一个四位数看看运行正确没。我觉得改成 array1[j] = ((i>>(j*8)) & 0 ...

int 4个字节32位  所以每次移动4位是一个16进制位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 16:21:07 | 显示全部楼层    本楼为最佳答案   
int main()
{
        long i;
        int j;
        int array1[4], array2[4];
        printf("请输入i\n");
        scanf("%d", &i);
        char *p = (char *)&i;
        for (j = 0; j<4; j++)
        {
                printf("%x ", (p[j]&0xff));
        }

        return 0;
}
这样可以直接输出int型的4个字节,但是你的要求是高四位,第四位,需要再把字节开成两个16进制位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 16:41:21 | 显示全部楼层
北冰羊 发表于 2020-12-4 16:21
int main()
{
        long i;


为什么输入1 输出是1 0 0 0,而不是 0 0 0 1
搞不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-4 16:52:55 | 显示全部楼层
取什么名字好… 发表于 2020-12-4 16:41
为什么输入1 输出是1 0 0 0,而不是 0 0 0 1
搞不懂

电脑大小端问题,小端对齐是先输出地位,大端对齐先输出高位,你那应该是小端对齐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-4 21:40:03 | 显示全部楼层
噢噢谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-6 21:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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