发新话题
打印

[讨论]C语言的问题

[讨论]C语言的问题

  问高手们一个问题,
main()
{char c;
c='\376';
printf("%d",c);
getch();
}
这个的输出结果什么?为什么会有这样的结果?
#include "stdio.h"
void main()
{
   float a=32769.89540;
   char b;
   b=a;
   printf("%d\n",b);
}
这个呢?
我在什么地方发现的也忘了,不过大家讨论下为什么能产生这样的结果还是有点研究的
别人说啥就是啥啊???

TOP

对于第一种情况,\376被解释成八进制值,然后对256的八进制进行取余运算,最后输出。
嘿嘿,推测的,没开编译器来测试。
对待处女,谁污染,谁治理。 对待内存,谁分配,谁释放。

TOP

第2个有警告
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(5) : warning C4305: 'initializing' : truncation from 'const double' to 'float'
C:\Documents and Settings\Administrator\My Documents\Cpp1.cpp(7) : warning C4244: '=' : conversion from 'float' to 'char', possible loss of data

那样用是不好滴
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

  对于第一个问题,字符类型的\ddd会被解析为一个八进制数值ddd的ascii码对应的字符。至于后面的getch()没有用过不知道是什么啊。
(刚看了下书,基本ascii码只有128个,而\376=254D,不会要用到unicode吧)


第二个应该是字符所占内存宽度的问题,char只有8位,类型转换后产生的问题。
(float与char类型数据运算,float转int,int转char。那么32769用二进制表示为1000000000000001,char只有一个字节的空间,所以剩下的就是00000001。)
BLOG: http://blog.csdn.net/hkbyest

TOP

引用:
下面是引用evilbogy于2005-04-03 16:34发表的:
对于第一个问题,字符类型的ddd会被解析为一个八进制数值ddd的ascii码对应的字符。至于后面的getch()没有用过不知道是什么啊。


第二个应该是字符所占内存宽度的问题,char只有8位,类型转换后产生的问题。
getch();在TC下是接受一个键盘字符 不回显不缓冲
相当于在VC下那个地方写上getchar();
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

将字符处理为不带符号的,把字符的8位放在整型变量的低8位,高8位补0
将字符处理为带符号的,若字字符最高位为0,则整形变量高8位补0,为1了,高8位补1
八进制的'\376'转换成二进制为11111110,因最高位为1,到整形中,其高8位补1,为1111111111111110,转换成补码存储时为1000000000000010,而在读取是就是-2.
别人说啥就是啥啊???

TOP

  getch(),getche(),getchar()的区别
这个问题,谭浩强的C语言设计第二版没有讲清楚,或者没有讲。
查了查其它的资料,总算搞清楚了。

getch()、getche()和getchar()函数
   (1) getch()和getche()函数
   这两个函数都是从键盘上读入一个字符。其调用格式为:
    getch();
    getche();
   两者的区别是: getch()函数不将读入的字符回显在显示屏幕上, 而getche()
函数却将读入的字符回显到显示屏幕上。
   例1:
#include <stdio.h>
#include <conio.h>
    main()
    {
       char c, ch;
       c=getch();    /*从键盘上读入一个字符不回显送给字符变量c*/
       putchar(c);   /*输出该字符*/
       ch=getche();  /*从键盘上带回显的读入一个字符送给字符变量ch*/
       putchar(ch);
    }
   利用回显和不回显的特点, 这两个函数经常用于交互输入的过程中完成暂停
等功能。
   例2:
#include <stdio.h>
#include <conio.h>
    main()
    {
       char c, s[20];
       printf("Name:");
       gets(s);
       printf("Press any key to continue...");
       getch();  /*等待输入任一键*/
    }
  
   (2) getchar()函数
   getchar()函数也是从键盘上读入一个字符, 并带回显。它与前面两个函数
的区别在于: getchar()函数等待输入直到按回车才结束,  回车前的所有输入字
符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。
   getchar()函数的调用格式为:
    getchar();
   例3:
#include <stdio.h>
#include <conio.h>
    main()
    {
       char c;
       c=getchar();  /*从键盘读入字符直到回车结束*/
       putchar(c);   /*显示输入的第一个字符*/
       getch();     /*等待按任一健*/
    }
例4
#include <stdio.h>
#include <conio.h>
    main()
    {
       char c;
       while ((c=getchar())!=&#39;\n&#39;)  /*每个getchar()依次读入一个字符*/
       printf("%c",c);   /*按照原样输出*/
       getch();     /*等待按任一健*/
    }
我没头像了。。。

TOP

引用:
下面是引用独孤加倍于2005-04-03 18:28发表的:
将字符处理为不带符号的,把字符的8位放在整型变量的低8位,高8位补0
将字符处理为带符号的,若字字符最高位为0,则整形变量高8位补0,为1了,高8位补1
八进制的&#39;376&#39;转换成二进制为11111110,因最高位为1,到整形中,其高8位补1,为1111111111111110,转换成补码存储时为1000000000000010,而在读取是就是-2.
独孤兄能说说这是什么书的内容么,我学的书上关于字符型数据没有深入的探讨。
BLOG: http://blog.csdn.net/hkbyest

TOP

C语言中数据的存储和转换啊
老潭的书上写的字符型付给整形变量有两种情况就是上面的2种
因为int型数据时有符号的,所以其他类型的数据转换成int型数据时,在内存中保存是以补码形式保存的
别人说啥就是啥啊???

TOP

好的,谢谢了。我去仔细翻翻先。
BLOG: http://blog.csdn.net/hkbyest

TOP

  对这样的问题我研究得比较多,只是在TC环境。

&#39;\376&#39;就是十进制254,作为有符号字符型范围只能是-128 ̄+127,因此对256取模让其结果落在该范围内,因此减去一个256,得-2。当然其原理还是二进制的问题,同样的一个二进制串作为有符号数和无符号数看待其对应的十进制往往就不同了。

浮点数 a=32769.89540要赋值给字符型b ,首先要取整变成32769,再对256取模,结果只剩1。其原理也就是5楼所说的。

TOP

我们现在正好在学C语言,许多问题都是很莫名其妙但找出错误又觉的自己的错误很幼稚。
岑夫子,丹丘生,将进酒,杯莫停!与君歌一曲,请君为我侧耳听!钟鼓馔玉不足贵,但愿长醉不愿醒!

TOP

发新话题