鱼C论坛

 找回密码
 立即注册
查看: 2634|回复: 10

关于C语言用按位或转换大小写的问题?

[复制链接]
发表于 2015-12-22 10:12:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 爱你没错 于 2016-1-3 10:43 编辑

用C语言自己写了个小写转大写的程序:
int mylowers(char c)
{
        char d=0;
        d = c | 32;
        return d;
}
调用后缺没法转成大写
反汇编代码如下:
27:   {
004010F0   push        ebp
004010F1   mov         ebp,esp
004010F3   sub         esp,44h
004010F6   push        ebx
004010F7   push        esi
004010F8   push        edi
004010F9   lea         edi,[ebp-44h]
004010FC   mov         ecx,11h
00401101   mov         eax,0CCCCCCCCh
00401106   rep stos    dword ptr [edi]
28:       char d=0;
00401108   mov         byte ptr [ebp-4],0
29:       d = c | 32;
0040110C   movsx       eax,byte ptr [ebp+8]
00401110   or          al,20h
00401112   mov         byte ptr [ebp-4],al
30:       return d;
00401115   movsx       eax,byte ptr [ebp-4]
31:   }
看看好像是对的,为什么却没效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-22 10:19:20 | 显示全部楼层
d是函数里面的局部变量,不能够作为返回值的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2015-12-22 11:07:25 | 显示全部楼层
小学期 发表于 2015-12-22 10:19
d是函数里面的局部变量,不能够作为返回值的。

没那个函数会return全局变量的吧!函数的返回值是可以用局部变量的,函数的调用过程说得很清楚:保存主调行数的下一条指令的地址相当于入栈,然后运行被调函数,返回返回值,退出被调函数,然后主调函数出栈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-25 20:53:03 | 显示全部楼层
符号用错了吧   &
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-25 23:30:28 | 显示全部楼层
q312102408 发表于 2015-12-25 20:53
符号用错了吧   &

lower是大写变小写,大写变小写ascii码是要变大所以或上0x20,小写变大写是减小ascii码值是与上0XDF
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-26 07:38:24 | 显示全部楼层
这么长,不想看,我只想睡觉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-26 18:00:43 | 显示全部楼层
#include <stdio.h>

int mylowers (char c);

int main ()
{
        printf ("%c\n", 'i');
        printf ("%c\n", mylowers ('i'));

        return 0;
}

int mylowers(char c)
{
        return c & 0xdf;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-26 18:02:25 | 显示全部楼层
#include <stdio.h>

int mylowers (char c);

int main ()
{
        printf ("%c\n", 'i');
        printf ("%c\n", mylowers ('i'));

        return 0;
}

int mylowers(char c)
{
        return c & 0xdf; //本来想为本行加红色,不知为什么不能
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-28 21:16:17 | 显示全部楼层
  #include <stdio.h>
  int main()
  {
  char ch;

  printf("请输入一个小写字母: ");
  scanf("%c",&ch);

  ch = ch - 32;             //这里是关键,因为在ASCII码表中小写字母和大写字母相差32个字符单位
                                  //且小写字母比大写字母大32个字符单位
                                        //所以小写字母减去32就可以得到大写字母了

        printf("大写字母是%c",ch);
  return 0;
  }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-30 21:04:01 | 显示全部楼层
黑执事 发表于 2015-12-28 21:16
  #include
  int main()
  {

我的初衷是想通过位运算来实现,因为位运算比算术运算快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-2 12:31:20 | 显示全部楼层
爱你没错 发表于 2015-12-30 21:04
我的初衷是想通过位运算来实现,因为位运算比算术运算快

不是用 or 应该用 and ,也就是 &
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 16:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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