免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2746 | 回复: 10
打印 上一主题 下一主题

[C] c语言的怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-15 18:22 |只看该作者 |倒序浏览
1可用积分
int main(int argc, char* argv[])
{
        int a=0;
        int b=~0;
        printf("int b= %d\n",b);
        char aa=0;
        char bb=~0;
        printf("char bb= %d\n",bb);
        unsigned int aaaa=0;
        unsigned int bbbb=~0;
        printf("unsigned int bbbb= %d\n",bbbb);
        unsigned char aaaaa=0;
        unsigned char bbbbb=~0;
        printf("unsigned char bbbbb= %d\n",bbbbb);
        long aaaaaa=0;
        long bbbbbb=~0;
        printf("long bbbbbb= %ld\n",bbbbbb);
        unsigned long aaaaaaaa=0;
        unsigned long bbbbbbbb=~0;
        double z=0;
        double s=~0;
        printf("double s= %f\n",s);
        unsigned double zz=0;
        unsigned double ss=~0;
        printf("Hello World!\n");
        return 0;
}

为什么printf("unsigned int bbbb= %d\n",bbbb); 出来的是-1
printf("unsigned char bbbbb= %d\n",bbbbb);出来的是255????


环境vc++6.0

论坛徽章:
0
2 [报告]
发表于 2008-03-15 19:47 |只看该作者
我的 gcc 4.1.3

lg@lg-laptop:~/c/test$ gcc -o strange strange.c
strange.c: 在函数 ‘main’ 中:
strange.c:25: 错误: 声明中同时使用了 ‘unsigned’ 和 ‘double’
strange.c:26: 错误: 声明中同时使用了 ‘unsigned’ 和 ‘double’

论坛徽章:
0
3 [报告]
发表于 2008-03-15 21:36 |只看该作者
vc6.0可以编译,各位有没有,什么好的解释?unsigned double不是关键
我问的是上面的问题

论坛徽章:
0
4 [报告]
发表于 2008-03-15 21:40 |只看该作者
原帖由 liec 于 2008-3-15 19:47 发表
我的 gcc 4.1.3

lg@lg-laptop:~/c/test$ gcc -o strange strange.c
strange.c: 在函数 ‘main’ 中:
strange.c:25: 错误: 声明中同时使用了 ‘unsigned’ 和 ‘double’
strange.c:26: 错误: 声明中同 ...



我手上没有gcc编译器,你打印出的结果是什么?

论坛徽章:
0
5 [报告]
发表于 2008-03-15 21:41 |只看该作者
你知道补码么?
char一个字节,int四个字节。。
看看它们的二进制表示就了解了。

论坛徽章:
0
6 [报告]
发表于 2008-03-15 22:01 |只看该作者
原帖由 redhat008 于 2008-3-15 21:41 发表
你知道补码么?
char一个字节,int四个字节。。
看看它们的二进制表示就了解了。


你等于没有说,我汇编代码都看了!不得其解,请大虾详细说明,为什么结果不一样?

19:       int a=0;
0040EB1B C7 45 F8 00 00 00 00 mov         dword ptr [ebp-8],0
20:       int b=~0;
0040EB22 C7 45 F4 FF FF FF FF mov         dword ptr [ebp-0Ch],0FFFFFFFFh
21:           printf("int b= %d\n",b);
0040EB29 8B 45 F4             mov         eax,dword ptr [ebp-0Ch]
0040EB2C 50                   push        eax
0040EB2D 68 14 50 42 00       push        offset string "int b= %d\n" (00425014)
0040EB32 E8 19 45 FF FF       call        printf (00403050)
0040EB37 83 C4 08             add         esp,8
22:       char aa=0;
0040EB3A C6 45 F0 00          mov         byte ptr [ebp-10h],0
23:       char bb=~0;
0040EB3E C6 45 EC FF          mov         byte ptr [ebp-14h],0FFh
24:       printf("char bb= %d\n",bb);
0040EB42 0F BE 4D EC          movsx       ecx,byte ptr [ebp-14h]
0040EB46 51                   push        ecx
0040EB47 68 54 50 42 00       push        offset string "char bb= %d\n" (00425054)
0040EB4C E8 FF 44 FF FF       call        printf (00403050)
0040EB51 83 C4 08             add         esp,8
25:       unsigned int aaaa=0;
0040EB54 C7 45 E8 00 00 00 00 mov         dword ptr [ebp-18h],0
26:       unsigned int bbbb=~0;
0040EB5B C7 45 E4 FF FF FF FF mov         dword ptr [ebp-1Ch],0FFFFFFFFh

27:       printf("unsigned int bbbb= %d\n",bbbb);
0040EB62 8B 55 E4             mov         edx,dword ptr [ebp-1Ch]
0040EB65 52                   push        edx
0040EB66 68 FC 4F 42 00       push        offset string "unsigned int bbbb= %d\n" (00424ffc)
0040EB6B E8 E0 44 FF FF       call        printf (00403050)
0040EB70 83 C4 08             add         esp,8
28:       unsigned char aaaaa=0;
0040EB73 C6 45 E0 00          mov         byte ptr [ebp-20h],0
29:       unsigned char bbbbb=~0;
0040EB77 C6 45 DC FF          mov         byte ptr [ebp-24h],0FFh
30:       printf("unsigned char bbbbb= %d\n",bbbbb);

0040EB7B 8B 45 DC             mov         eax,dword ptr [ebp-24h]
0040EB7E 25 FF 00 00 00       and         eax,0FFh
0040EB83 50                   push        eax
0040EB84 68 38 50 42 00       push        offset string "unsigned char bbbbb= %d\n" (0042503
0040EB89 E8 C2 44 FF FF       call        printf (00403050)
0040EB8E 83 C4 08             add         esp,8
31:       long aaaaaa=0;
0040EB91 C7 45 D8 00 00 00 00 mov         dword ptr [ebp-28h],0
32:       long bbbbbb=~0;
0040EB98 C7 45 D4 FF FF FF FF mov         dword ptr [ebp-2Ch],0FFFFFFFFh
33:       printf("long bbbbbb= %ld\n",bbbbbb);
0040EB9F 8B 4D D4             mov         ecx,dword ptr [ebp-2Ch]
0040EBA2 51                   push        ecx
0040EBA3 68 E8 4F 42 00       push        offset string "long bbbbbb= %ld\n" (00424fe
0040EBA8 E8 A3 44 FF FF       call        printf (00403050)

论坛徽章:
0
7 [报告]
发表于 2008-03-15 22:18 |只看该作者
tc2.0也一样

论坛徽章:
0
8 [报告]
发表于 2008-03-15 22:30 |只看该作者

回复 #6 zywmz 的帖子

最关键的指令你没注意到:

0040EB5B C7 45 E4 FF FF FF FF mov         dword ptr [ebp-1Ch],0FFFFFFFFh
0040EB62 8B 55 E4             mov         edx,dword ptr [ebp-1Ch]
0040EB65 52                   push        edx

能不是 -1 吗?

---------------------------------------------------------------------------------------------
0040EB77 C6 45 DC FF          mov         byte ptr [ebp-24h],0FFh
0040EB7B 8B 45 DC             mov         eax,dword ptr [ebp-24h]
0040EB7E 25 FF 00 00 00       and         eax,0FFh
0040EB83 50                   push        eax

能不是 256 吗?

论坛徽章:
0
9 [报告]
发表于 2008-03-15 22:43 |只看该作者
原帖由 zywmz 于 2008-3-15 22:01 发表


你等于没有说,我汇编代码都看了!不得其解,请大虾详细说明,为什么结果不一样?

19:       int a=0;
0040EB1B C7 45 F8 00 00 00 00 mov         dword ptr [ebp-8],0
20:       int b=~0;
0040EB2 ...


真的不明白,既然看了汇编都不明白,你看汇编有何用?

论坛徽章:
0
10 [报告]
发表于 2008-03-16 00:44 |只看该作者
因为你printf 的是个 unsigned int 型
所以要用
printf("unsigned int bbbb= %u  \n",bbbb);
不能用%d


另外编译不通过是因为:

double 是浮点数。
浮点数和整数的编码不一样的。
没有UNSIGNED。

我是菜鸟,说错了。别鄙视。

[ 本帖最后由 sasc 于 2008-3-16 00:58 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP