一个移位的问题,怎么不明白呢?

lzy0001sl 2010-03-02 03:09:59
char *str = (char *)malloc(100);
memset(str, 0, 100);
fflush(stdin);
scanf("%s", str);
*(unsigned short*)(str+strlen(str)-1) = (*(str+strlen(str)-1))<<8;


例如输入:hello
那么在执行完最后一句之后,在内存中看到的str是:hell'\0'o
我怎么感觉应该是hell'\0''\0'啊,最后一句实现了不用中间变量交换字符串的最后一个字符与'\0'位置的功能
...全文
170 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
we_sky2008 2010-03-02
  • 打赏
  • 举报
回复
引用 12 楼 jamesf1982 的回复:
引用 9 楼 we_sky2008 的回复:引用 5 楼 jamesf1982 的回复: 引用 3 楼 steedhorse 的回复:然后按照向左移位的规则,低位上(也就是前面)补充过来8个bit的0,形成一个'\0'字符。 呵呵,实际上不是交换,而是补上的。 确实是交换了,可以测试下: #include <stdio.h> #include <string.h> #include <malloc.h> int main() {     char *str = (char *)malloc(100);     memset(str, 0, 100);     fflush(stdin);     scanf("%s", str);     *(unsigned  int*)(str+strlen(str)-1)  =  (*(str+strlen(str)-1)) < <8;     printf("%s\n", str);     printf("%#.2x\t%#.2x\t%#.2x\n", *(str+strlen(str)-1),*(str+strlen(str)), *(str+strlen(str)+1));     free (str);     return 0; }

其实是补上的。。。看起来像是交换了。。。要不你试试可不可以把“hello”里的元素交换一下。

(*(str+strlen(str)-1))  < <8;这一步会在低位补0,而不是把旁边的字节拉过来。


其实还是补上的,
开起来像是交换了
呵呵
we_sky2008 2010-03-02
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main()
{
char *str = (char *)malloc(100);
memset(str, 0, 100);
fflush(stdin);
scanf("%s", str);
*(unsigned int*)(str+strlen(str)-1) = (*(str+strlen(str)-1)) <<8;

printf("%s\n", str);
printf("%#.2x\t%#.2x\t%#.2x\n", *(str+strlen(str)-1),*(str+strlen(str)), *(str+strlen(str)+1));

free (str);
return 0;
}

假如我们输入1234
则内存地址从低到高16进制内容为:31 32 33 34 00
(*(str+strlen(str)-1))也就是34
<<8是这时涉及到整值提升 相当于0x00000034<<8 结果为0x00003400
*(unsigned int*)(str+strlen(str)-1)这里有个char*到int*强制转换
在小端模式下,即低位低地址
*(unsigned int*)(str+strlen(str)-1) = (*(str+strlen(str)-1)) <<8;所以赋值后:
内存地址16进制内容为如下:
31 32 33 00 34 00 00//标注颜色部分即为移位后的0x00003400
james_hw 2010-03-02
  • 打赏
  • 举报
回复
引用 9 楼 we_sky2008 的回复:
引用 5 楼 jamesf1982 的回复:
引用 3 楼 steedhorse 的回复:然后按照向左移位的规则,低位上(也就是前面)补充过来8个bit的0,形成一个'\0'字符。

呵呵,实际上不是交换,而是补上的。
确实是交换了,可以测试下:
#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main()
{
    char *str = (char *)malloc(100);
    memset(str, 0, 100);
    fflush(stdin);
    scanf("%s", str);
    *(unsigned  int*)(str+strlen(str)-1)  =  (*(str+strlen(str)-1)) < <8;

    printf("%s\n", str);
    printf("%#.2x\t%#.2x\t%#.2x\n", *(str+strlen(str)-1),*(str+strlen(str)), *(str+strlen(str)+1));

    free (str);
    return 0;
}


其实是补上的。。。看起来像是交换了。。。要不你试试可不可以把“hello”里的元素交换一下。

(*(str+strlen(str)-1)) < <8;这一步会在低位补0,而不是把旁边的字节拉过来。
lizzoe 2010-03-02
  • 打赏
  • 举报
回复
引用 10 楼 aozhi 的回复:
X86是little end的哦。别忘了。
今天就遇到一个自作聪明的日本人,这么写程序。被我羞臊了。
老老实实地用字符数组多好呢?


顶一个……
aozhi 2010-03-02
  • 打赏
  • 举报
回复
X86是little end的哦。别忘了。
今天就遇到一个自作聪明的日本人,这么写程序。被我羞臊了。
老老实实地用字符数组多好呢?
we_sky2008 2010-03-02
  • 打赏
  • 举报
回复
引用 5 楼 jamesf1982 的回复:
引用 3 楼 steedhorse 的回复:然后按照向左移位的规则,低位上(也就是前面)补充过来8个bit的0,形成一个'\0'字符。

呵呵,实际上不是交换,而是补上的。

确实是交换了,可以测试下:
#include<stdio.h>
#include<string.h>
#include<malloc.h>

int main()
{
char *str = (char *)malloc(100);
memset(str, 0, 100);
fflush(stdin);
scanf("%s", str);
*(unsigned int*)(str+strlen(str)-1) = (*(str+strlen(str)-1)) <<8;

printf("%s\n", str);
printf("%#.2x\t%#.2x\t%#.2x\n", *(str+strlen(str)-1),*(str+strlen(str)), *(str+strlen(str)+1));

free (str);
return 0;
}
lionliu_26 2010-03-02
  • 打赏
  • 举报
回复
汗一个,再仔细研究一下
cy330206 2010-03-02
  • 打赏
  • 举报
回复
这个方法不错,学习了
starstroll 2010-03-02
  • 打赏
  • 举报
回复
memset(str, 0, 100); 

已经确定你的字符串是100个'\0'了,都知道\0是字符串结束,你怎么还能看到后面的'\0'呢?除非暴力点指针跳到那用'\0'比较一下。
james_hw 2010-03-02
  • 打赏
  • 举报
回复
引用 3 楼 steedhorse 的回复:
然后按照向左移位的规则,低位上(也就是前面)补充过来8个bit的0,形成一个'\0'字符。


呵呵,实际上不是交换,而是补上的。
threewall 2010-03-02
  • 打赏
  • 举报
回复
*(unsigned short*)(str+strlen(str)-1) = (*(str+strlen(str)-1)) < <8;
主要是因为这句代码,你是从str+strlen(str)-1这个位置上先左移8bit后直接拷贝16bit给str+strlen(str)-1这个位置,这样的话在str+strlen(str)-1这个位置后的16bit就是'\0'o,运行后就是hell'\0'o 。而如果你使用了一个临时变量,结果就是你所期望的那样了。
晨星 2010-03-02
  • 打赏
  • 举报
回复
然后按照向左移位的规则,低位上(也就是前面)补充过来8个bit的0,形成一个'\0'字符。
晨星 2010-03-02
  • 打赏
  • 举报
回复
别忘了在i386系列的处理器中,short/int等多字节整数都是little-endian的,也就是低字节在前,高字节在后。
所以左移8位后,原来最后一个位置上的那个‘o’所对应的8个bit被移到高位上去了,也就是到了后面去了。
james_hw 2010-03-02
  • 打赏
  • 举报
回复
牛,不过我怎么看都不应该是hell'\0'o 。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧