LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 751|回复: 6

c 菜鸟请教各位高手个问题

[复制链接]
发表于 2004-2-18 22:56:41 | 显示全部楼层 |阅读模式
好多地方搞不清,那位能帮我分析分析?谢谢
一个机器:
bash-2.05$ gcc -g -o swapmain swapmain.c
bash-2.05$ more swapmain.c
#define A 32767
#define B 32766
#include <stdio.h>

int main(){
   
  int a=A;
  int b=B;
  printf("a=%x\nb=%x\n",&a,&b);
  printf("unsigned a=%X\nb=%X\n",&a,&b);
  a=a+b;
  b=a-b;
  a=a-b;
  printf("a=%d\nb=%d\n",&a,&b);
  printf("a=%x\nb=%x\n",&a,&b);
  return 0;
}
bash-2.05$ ./swapmain
a=ffbeee14
b=ffbeee10
unsigned a=FFBEEE14
b=FFBEEE10
a=-4264428
b=-4264432
a=ffbeee14
b=ffbeee10

另一个机器:
bash-2.05b$ gcc -g -o swapmain swapmain.c
bash-2.05b$ more swapmain.c
#define A 32767
#define B 32766
#include <stdio.h>

int main(){

        int a,b;
        a=A;
        b=B;
        printf("a=%x\nb=%x\n",&a,&b);
        printf("a=%d\nb=%d\n",&a,&b);
        printf("* * * * * * *\n");
        a=a+b;
        b=a-b;
        a=a-b;
        printf("a=%d\nb=%d\n",&a,&b);
        printf("a=%x\nb=%x\n",&a,&b);
        return 0;
}
bash-2.05b$ ./swapmain
a=bffff804
b=bffff800
a=-1073743868
b=-1073743872
* * * * * * *
a=-1073743868
b=-1073743872
a=bffff804
b=bffff800

我好像是用了16bit的数字啊,怎么会变这样啊??而且2个机器输出结果也不一样。。。。。。。
发表于 2004-2-19 00:22:51 | 显示全部楼层
妳兩臺分別是什么?型的機器?似乎他們對于int?型的理解是不同的。
 楼主| 发表于 2004-2-19 00:36:50 | 显示全部楼层
忘了说了,一台是机二:AMD1000 & 712MB SDRAM133 & MAXTOR 120G & geforce2mx & winxp pro & slackware9,1
另一台是
Sun Sparc ultra 160(好像) Sun Microsystems Inc.   SunOS 5.8       Generic Patch   December 2002

bash-2.05$ gcc -v
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3/specs
Configured with: ../configure --disable-nls --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld
Thread model: posix
gcc version 3.3

bash-2.05b$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-slackware-linux/3.2.3/specs
Configured with: ../gcc-3.2.3/configure --prefix=/usr --enable-shared --enable-threads=posix --enable-__cxa_atexit --disable-checking --with-gnu-ld --verbose --target=i486-slackware-linux --host=i486-slackware-linux
Thread model: posix
gcc version 3.2.3
发表于 2004-2-19 01:59:02 | 显示全部楼层
你的printf里为什么都有'&',把这个去掉
 楼主| 发表于 2004-2-19 07:55:49 | 显示全部楼层

好久没写c语言了,把scanf 和printf搞错了,还有就是我的c语言的书被人借了不还了。。。
还有些问题想问问版主,
1)c语言是不是先转换成汇编语言再转换成2进制,所以是不是比较好程序写完后先用汇编想一想?
2)int类是不是默认取16位,但数字大的时候会自动取32位?
3)sun 的芯片是64位的,为什么它分配的地址只有32位?
4)实际用c编译程序,是不是每一种系统会效果不一样?
5)其它问题等我想到再问
万分感谢大家对我的支持!!!:p:p
 楼主| 发表于 2004-2-19 08:32:38 | 显示全部楼层
程序测试好了,好像没有溢出问题:
swapint.c

#include <stdio.h>


int swapint(int a,int b){

        //int a = a1;
        //int b = b1;

        printf("before:\n a=%x\nb=%x\n",a,b);
        printf("before in hex\na=%d\nb=%d\n",a,b);
        printf("* * * * * * *\n");
        a=a+b;
        printf("new a=%d\n",a);
        b=a-b;
        a=a-b;
        printf("finally\n a=%d\nb=%d\n",a,b);
        printf("finally in hex\n a=%x\nb=%x\n",a,b);
        return 0;
}

swapmain.c:

#include "swapint.c"
//16bits operations 2^16
#define A1 65535
#define B1 65534
//32bits operations 2^32
#define A2 2147483647
#define B2 2147483646
#define A3 -2147483647
#define B3 -2147483646
#define A4 -1//to test ffffffff+fffffff
#define B4 -1

int main(){

        swapint(A1,B1);
        swapint(A2,B2);
        swapint(A3,B3);//test 2*(-2147483648)
        swapint(A4,B4);
        return 0;
}

运行结果:

bash-2.05b$ gcc -g -o swap2 swapmain.c
bash-2.05b$ ./swap2
before:
a=ffff
b=fffe
before in hex
a=65535
b=65534
* * * * * * *
new a=131069
finally
a=65534
b=65535
finally in hex
a=fffe
b=ffff
before:
a=7fffffff
b=7ffffffe
before in hex
a=2147483647
b=2147483646
* * * * * * *
new a=-3  <- 注意这里有溢出
finally
a=2147483646
b=2147483647
finally in hex
a=7ffffffe
b=7fffffff
before:
a=80000001
b=80000002
before in hex
a=-2147483647
b=-2147483646
* * *= * * * *
new a=3  <- 注意这里有溢出
finally
a=-2147483646
b=-2147483647
finally in hex
a=80000002
b=80000001
before:
a=ffffffff
b=ffffffff
before in hex
a=-1
b=-1
* * * * * * *
new a=-2
finally
a=-1
b=-1
finally in hex
a=ffffffff
b=ffffffff

说明一下:
模拟一下寄存器:(这里是16位的,但其实是32位的,但原理是一样的)
1111,1111,1111,1111+
1111,1111,1111,1110=
1111,1111,1111,1101(a+b)<-寄存器中的 a+b
a-b
1111,1111,1111,1101+
0000,0000,0000,0001+
0000,0000,0000,0001=
1111,1111,1111,1111

所以最后结果不会造成溢出(不管是地址,整数或字符)
但做加法时会溢出,但不影响最后结果
但总觉得那个加法会有不妥当的地方。。。
发表于 2004-2-19 21:20:04 | 显示全部楼层
1)c语言是不是先转换成汇编语言再转换成2进制,所以是不是比较好程序写完后先用汇编想一想?
是否先转换成汇编取决于编译器,C语言本身没有规定,用汇编想一想就不用了吧,当然,能理解更好一点。
2)int类是不是默认取16位,但数字大的时候会自动取32位?
int类型的大小取决于编译器,目前流行的编译器都是32位的。
3)sun 的芯片是64位的,为什么它分配的地址只有32位?
这个问题同上,比如你在32位的机器上用TC 2,int类型照样是16位的,不过最好找一个和机器匹配的编译器。
4)实际用c编译程序,是不是每一种系统会效果不一样?
是,每种系统的指令集都不一样,编译出来的当然不一样了,所以每种系统都有自己的编译器。
5)其它问题等我想到再问
......
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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