| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1536 人关注过本帖
标题:求助!字节占用问题
只看楼主 加入收藏
迷童
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-9-28
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:6 
求助!字节占用问题
定义一个字符型变量d,并给他赋值,假使赋值c,其二进制表示应该是01100011,如果printf("%d",d)这样输出,最后d的二进制表示是变成了00000000 00000000 00000000 01100011还是变成11111111 11111111 11111111 01100011,求助
搜索更多相关主题的帖子: 字节 赋值 二进制 表示 输出 
2017-10-09 23:42
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:3 
00000000 00000000 00000000 01100011

早知做人那么辛苦!  当初不应该下凡
2017-10-10 01:01
蓝色风暴cl
Rank: 8Rank: 8
来 自:新疆
等 级:蝙蝠侠
威 望:3
帖 子:163
专家分:704
注 册:2015-9-6
收藏
得分:3 
c的ascii码小于127,char是有符号,unsigned char是无符号,由此可知
正常来说,肯定是前者,你写的后者应该还是有问题,我猜测你想表述的是反码的形式,但是仔细看,你写的?
今天没啥事,于是就多搞了一下,可能会更明白(我猜哈)。我也是第一次深入搞这个,原来也只是建立在书本的基础上。
我用汇编器做了测试,可以参考一下(不一定对):
main proc
      count = 'c'
      mov eax,count

      ret
main endp
以上是汇编写的代码,其他的省略了。

以下是反汇编结果
CPU Disasm
地址        十六进制数据            指令
00401000    E8 20000000     CALL 00401025
。。。中间省略
00401025    B8 63000000     MOV EAX,63
寄存器结果 EAX = 00000063h

然后觉得是数据的问题,于是赋值9Fh>127(d),但是汇编语言写出来的结果则是0000009F

之后又用vs写了一个测试程序
。。。省略部分

char fun()
{
    char c;
    c = 'c';
    printf(“%d”,c);【一开始没有加这句,最后一次调试的时候加上了,查看打印程序的时候的过程】
    return c;
}
int main(int argc, char* argv[])
{
    char d;
    d = 'c';
    d = d + 1;
    fun();
    return 0;
}
调试进入反汇编窗口,调出寄存器,查看过程
int main(int argc, char* argv[])
{
00CB16D0  push        ebp  开始
。。。
    中间省略
。。。

    char d;
    d = 'c';
00CB16EE  mov         byte ptr [d],63h 将‘c’复制给d
    d = d + 1;
00CB16F2  movsx       eax,byte ptr [d]  对d进行有符号位扩展,char型默认是有符号形式。
这些语句运行完
EAX = 00000064
EBX = 7E36A000
 
    fun();
00CB16FC  call        fun (0CB1208h)  

fun函数反汇编(部分)
    char c;
    c = 'c';
00CB16AE  mov         byte ptr [c],63h  没加printf语句
    return c;
00CB16B2  mov         al,byte ptr [c] 只会改变32位中的最低八位

加一句打印语句
char c;
    c = 'c';
01081D3E  mov         byte ptr [c],63h  
    printf("%d", c);
01081D42  movsx       eax,byte ptr [c]  就会进行位扩展
01081D46  push        eax  
01081D47  push        offset string "%d" (01086B30h)  
01081D4C  call        _printf (01081357h)  
01081D51  add         esp,8
这些语句运行完
EAX = 00000063 EBX = 7E36A000 ECX = 00000000 EDX = 01089580 ESI = 01081046 EDI = 006EF67C EIP = 01081D46 ESP = 006EF5A4 EBP = 006EF67C EFL = 00000202

最近在学习学习汇编语言,趁着这个问题,搞一搞,一搞就睡不着觉了。。
是妹子不?如果是加个好友呗,咱俩聊聊。

欢迎大家加好友哦,多找我聊聊吧!
2017-10-10 01:13
蓝色风暴cl
Rank: 8Rank: 8
来 自:新疆
等 级:蝙蝠侠
威 望:3
帖 子:163
专家分:704
注 册:2015-9-6
收藏
得分:0 
我的锅,你第二个是对的,这个是表述的符号位扩展,我理解成反码了。
我接着进行测试,对C赋值156(d)>127(d),

char c;
    c = 156;
00FD1D3E  mov         byte ptr [c],9Ch  
    printf("%d", c);
00FD1D42  movsx       eax,byte ptr [c]  
00FD1D46  push        eax  
00FD1D47  push        offset string "%d" (0FD6B30h)  
00FD1D4C  call        _printf (0FD1357h)  
00FD1D51  add         esp,8
最终的结果
EAX = FFFFFF9C  进行符号位扩展EBX = 7F34F000 ECX = 00000000 EDX = 00FD9580 ESI = 00FD1046 EDI = 00B4F894 EIP = 00FD1D46 ESP = 00B4F7BC EBP = 00B4F894 EFL = 00000212

欢迎大家加好友哦,多找我聊聊吧!
2017-10-10 01:18
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10541
专家分:42927
注 册:2014-5-20
收藏
得分:3 
图片附件: 游客没有浏览图片的权限,请 登录注册

#include <stdio.h>
#include <limits.h>
int bin(int a)
{
    int i;
    for (i=sizeof(int)*CHAR_BIT-1; i>=0; --i)
    {
        printf("%d", (a>>i)&1);
        if (i%8==0) printf(" ");
    }
    printf("\n");
    return a;
}
main()
{
    char d = 'c';
    printf("%d\n", bin(d));
    d = 127;
    printf("%d\n", bin(d));
    d = 128;
    printf("%d\n", bin(d));
}

2017-10-10 05:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:3 
说两点,第一:
char 既不是 signed char 类型,也不是 unsigned char 类型;
char是否为具符号类型是实现定义的;
char若实现为具符号,它也不是signed char;char若实现为无符号,它也不是unsigned char。

#include <stdio.h>

#define putchartype(X) puts( _Generic((X), char:"char", signed char:"signed char", unsigned char:"unsigned char", default:"other") )

int main( void )
{
    char a = 0;
    signed char b = 0;
    unsigned char c = 0;
   
    putchartype( a );
    putchartype( b );
    putchartype( c );
}

第二,一个整型提升为更高的整型的规则
这个规则是人为定义的,那么就必然是符合人类常识的呀
所有智商正常的人,肯定都希望+1提升后依然是+1,-1提升后依然是-1。
即使遇到特殊的情况,比如将-1提升为一个无符号整型,那么结果起码也应该和-1是二进制一致的,这样转来转去,值可以保证不变。
如果懒得去思考,记住一个规则:具符号类型按照符号位扩展(符号位为0就扩0,符号位为1就扩1),而无符号类型既然都无符号位了,当然是0扩展。
2017-10-10 09:29
蓝色风暴cl
Rank: 8Rank: 8
来 自:新疆
等 级:蝙蝠侠
威 望:3
帖 子:163
专家分:704
注 册:2015-9-6
收藏
得分:0 
虽然意思是,但是还是不明白为啥: char 既不是 signed char 类型,也不是 unsigned char 类型;char是否为具符号类型是实现定义的;
这个还是不一样的吧?最起码扩展传送指令是不一样的
signed char a;
    a = 99;
00253C3E  mov         byte ptr [a],63h  
    a += 1;
00253C42  movsx       eax,byte ptr [a]  
EAX = 00000063 EBX = 7F16E000 ECX = 00000000 EDX = 00259580 ESI = 00251046 EDI = 00DCFC40 EIP = 00253C46 ESP = 00DCFB44 EBP = 00DCFC40 EFL = 00000206
00253C46  add         eax,1  
EAX = 00000064 EBX = 7F16E000 ECX = 00000000 EDX = 00259580 ESI = 00251046 EDI = 00DCFC40 EIP = 00253C49 ESP = 00DCFB44 EBP = 00DCFC40 EFL = 00000202
00253C49  mov         byte ptr [a],al  
    //printf("%d", a);
    unsigned char b;
    b = 99;
00253C4C  mov         byte ptr [b],63h  
    b += 1;
00253C50  movzx       eax,byte ptr [b]  
EAX = 00000063 EBX = 7F16E000 ECX = 00000000 EDX = 00259580 ESI = 00251046 EDI = 00DCFC40 EIP = 00253C54 ESP = 00DCFB44 EBP = 00DCFC40 EFL = 00000202
00253C54  add         eax,1  
EAX = 00000064 EBX = 7F16E000 ECX = 00000000 EDX = 00259580 ESI = 00251046 EDI = 00DCFC40 EIP = 00253C57 ESP = 00DCFB44 EBP = 00DCFC40 EFL = 00000202
00253C57  mov         byte ptr [b],al  
    //printf("%d", b);
    signed char c;
    c = 156;
00253C5A  mov         byte ptr [c],9Ch  
    c += 1;
00253C5E  movsx       eax,byte ptr [c]  
EAX = FFFFFF9C EBX = 7F16E000 ECX = 00000000 EDX = 00259580 ESI = 00251046 EDI = 00DCFC40 EIP = 00253C62 ESP = 00DCFB44 EBP = 00DCFC40 EFL = 00000202
00253C62  add         eax,1
EAX = FFFFFF9D EBX = 7F16E000 ECX = 00000000 EDX = 00259580 ESI = 00251046 EDI = 00DCFC40 EIP = 00253C65 ESP = 00DCFB44 EBP = 00DCFC40 EFL = 00000282
00253C65  mov         byte ptr [c],al  
    //printf("%d", c);
    unsigned char d;
    d = 156;
00253C68  mov         byte ptr [d],9Ch  
    d += 1;
00253C6C  movzx       eax,byte ptr [d]  
EAX = 0000009C EBX = 7F16E000 ECX = 00000000 EDX = 00259580 ESI = 00251046 EDI = 00DCFC40 EIP = 00253C70 ESP = 00DCFB44 EBP = 00DCFC40 EFL = 00000282
00253C70  add         eax,1  
EAX = 0000009D EBX = 7F16E000 ECX = 00000000 EDX = 00259580 ESI = 00251046 EDI = 00DCFC40 EIP = 00253C73 ESP = 00DCFB44 EBP = 00DCFC40 EFL = 00000202
00253C73  mov         byte ptr [d],al

欢迎大家加好友哦,多找我聊聊吧!
2017-10-10 18:06
快速回复:求助!字节占用问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016717 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved