有什么污污的手机上什么游戏比较污游戏

欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 6179 人关注过本帖
标题:为什么浮点数不能赋给整型变量啊?
等 级:新手上路
帖 子:20
结帖率:85.71%
&&已结贴√
&&问题点数:20&&回复次数:6&&&
为什么浮点数不能赋给整型变量啊?
我记得是可以的啊
但是用scanf()获得一个浮点数 然后直接赋给整型变量 运行程序 就会提示RUNTIME&&如
a=scanf(&%f&,&a);
scanf(&%f&,&a);
请高人解答!
#include&stdio.h&
int main()
&&& scanf(&%f&,&a);
printf(&%d&,b);
&&& return 0;
没有错啊..
[ 本帖最后由 a 于
16:26 编辑 ]
搜索更多相关主题的帖子:
来 自:神界
等 级:贵宾
威 望:351
帖 子:11794
专家分:46459
没有规矩不成方圆&&一切还是按照章程来办事 好些&&&除非你有足够的能力打破规则
DO IT YOURSELF !
等 级:新手上路
帖 子:20
回复 2 楼 wp231957
但是第二种是按规矩来的啊
我用VC++运行几次,偶尔能成功
大部分不成功..
等 级:黑侠
帖 子:111
专家分:696
赋值中的类型转换
当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下:
(1) 浮点型与整型
● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分, 只保留整数部分。
将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式, 即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。
(2) 单、双精度浮点型
● 由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为doub1e型数据参加运算,然后直接赋值。doub1e型数据转换为float型时,通过截尾数来实现,截断前要进行四舍五入操作。
(3) char型与int型
● int型数值赋给char型变量时,只保留其最低8位,高位部分舍弃。
● chr型数值赋给int型变量时, 一些编译程序不管其值大小都作正数处理,而另一些编译程序在转换时,若char型数据值大于127,就作为负数处理。对于使用者来讲,如果原来char型 数据取正值,转换后仍为正值;如果原来char型值可正可负,则转换后也仍然保持原值, 只是数据的内部表示形式有所不同。
(4) int型与1ong型
● long型数据赋给int型变量时,将低16位值送给int型变量,而将高16 位截断舍弃。(这里假定int型占两个字节)。
将int型数据送给long型变量时,其外部值保持不变,而内部形式有所改变。
(5) 无符号整数
● 将一个unsigned型数据赋给一个占据同样长度存储单元的整型变量时(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照赋,内部的存储方式不变,但外部值却可能改变。
● 将一个非unsigned整型数据赋给长度相同的unsigned型变量时, 内部存储形式不变,但外部表示时总是无符号的。
听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
来 自:陕西
等 级:业余侠客
帖 子:127
专家分:216
回复 4 楼 liao
“听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。”
等 级:新手上路
帖 子:20
妹的 昨天不行今天什么都没改 又能运行了 ..
来 自:湖~
等 级:黑侠
帖 子:145
专家分:644
回复 楼主 a
#include &stdio.h&
int main( void )
**在VC6.0中
**在定义f和scanf这两条语句之间,应该对f至少有一个运算操作(比如初始化),以便编译器载入浮点数据库,
**否则虽然编译会通过,但调试时会出现runtime error错误。
**另外,也可以通过将“float f”改为“double f”来避免此错误。
**这里对f进行至少一个运算操作
scanf( &%f&, &f );
[ 本帖最后由 yahwei 于
17:48 编辑 ]
版权所有,并保留所有权利。
Powered by , Processed in 0.062077 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reservedchar 类型和int比较大小_C++,C语言_ThinkSAAS
char 类型和int比较大小
char 类型和int比较大小
内容来源: 网络
先看下面一段代码
#include &stdio.h&
unsigned char c = -1;
signed int i = 1;
printf("%c
printf("c&i
printf("c&=i
我是在gcc下编译的,奇怪的是表达式printf("%c",c);打印出来的是乱码(一个带有背景的?),但是却是能比较出来结果的,c&i,但是c为什么大于i呢?为什么打印出来的结果是乱码呢?ASCI编码下的-1是不可打印字符?
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信代码如下:
char&aa,a&=&0x80;
unsigned&char&bb,b&=&0x80;
&&&aa&=&a-b;
&&&bb&=&a-b;
&&&&&&&if((a-b)==0)
&&&&&&&a=0x80;//不执行&1
a=0x80;//执行&&2
a=0x80;//执行&&3
a=0x80;//不执行&&4
a=0x80;//执行&&5
为啥1不能执行而2,3能执行?直接用a-b和0比较与aa和0比较有啥区别?
而4不能执行5能执行又怎么理解?
回复讨论(解决方案)
为啥1不能执行而2?
if((a-b)==0)这样写已经提示为int类型了,
if((char)(a-b)==0)
为啥1不能执行而2?
if((a-b)==0)这样写已经提示为int类型了,
if((char)(a-b)==0)
&if((a-b)==0)这样写已经提示为int类型了,&是什么意思?
if((a-b)==0)
无效的比较,a与b都是变量,无法和常量比较大小,所以为假,不执行
去看下左值的定义
楼主搜下下整值提升,C/C++中,当数据类型小于int的类型参加运算之前会先提升为int
比如楼主的例子:
因为a是char类型,b是unsigned&char,两个的数据类型长度都小于int
所以在求表达式a&-&b;之前会首先将a和b都提升为int类型
unsigned&char到int提升时,高位直接补0就好了,&0x80&--&&0x
char提升为int时,具体结果和编译器的实现相关(值保留或者位保留),楼主的编译器是采用的值保留,高位是扩展的符号位,所以0x80&--&&0xffffff80;所以a&-&b&==&256;
楼主搜下下整值提升,C/C++中,当数据类型小于int的类型参加运算之前会先提升为int
比如楼主的例子:
因为a是char类型,b是unsigned&char,两个的数据类型长度都小于int
所以在求表达式a&-&b;之前会首先将a和b都提升为int类型
unsigned&char到int提升时,高位直接补0就好了,&0x80&--&&0x
char提升为int时,具体……
楼主搜下“整值提升”
&&aa&=&a-b;
&&bb&=&a-b;
//上面已经说了在楼主的编译器中a&-&b&==&256&==&0x100;&因为aa&bb都是只有一个字节大小,所以截断为一个字节之后,aa,bb的值都是0x00也就是0了
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
if((a-b)==0)
无效的比较,a与b都是变量,无法和常量比较大小,所以为假,不执行
去看下左值的定义
这是何等的乱说啊&:)
这里是典型的整型提升问题
char一般默认为等同与signed&char(虽然标准未这么规定)
signed&char与unsigned&char提升后结果不一样
int&main()
char&a=0x80;
unsigned&char&b=0x80;
if((a-b)==0xffffff00)
cout&&&&what's&the&f*&&&&
楼主搜下下整值提升,C/C++中,当数据类型小于int的类型参加运算之前会先提升为int
比如楼主的例子:
因为a是char类型,b是unsigned&char,两个的数据类型长度都小于int
所以在求表达式a&-&b;之前会首先将a和b都提升为int类型
unsigned&char到int提升时,高位直接补0就好了,&0x80&--&&0x
char提升为int时,具……
学习了,看到高手总有些自卑啊,自己要学的还太多。。。
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸……
多谢多谢!我用的vs2005,忘了看内存窗口了
测试环境:VS2010
测试代码:
int&main()
&&&&char&a&=&0x20;
&&&&unsigned&char&b&=&0x20;
&&&&if((a-b)&==&0x00)
&&&&&&&&printf(&----\n&);
&&&&printf(&%d\n&,a-b);
&&&&getchar();
&&&&return&0;
输出结果:
整型提升的?&跑过就知道了,笑话
测试环境:VS2010
测试代码:
C/C++&code
int&main()
&&&&char&a&=&0x20;
&&&&unsigned&char&b&=&0x20;
&&&&if((a-b)&==&0x00)
&&&&&&&&printf(&----\n&);
&&&&printf(&%d\n&,a-b);
&&&&getchar();
&&&&return&0;
这是两者提升的结果(根据编译器)相同而已啊
你在#3楼说“无效的比较,a与b都是变量,无法和常量比较大小”,呵呵
你就是(a-a)==0,除非优化,否则也得提升
if((a-b)==0)
无效的比较,a与b都是变量,无法和常量比较大小,所以为假,不执行
去看下左值的定义
我一向不看那些定义的,知道别人理解了之后写出来的东西看了是什么效果吗?那就是:懂的人,看懂了,不懂的人看了之后可能会更不懂。我做了下测试,抛开符号位的影响。
if((a-b)&==&0)
printf(&Pass\n&);
if((a-b)&==&0)
printf(&Pass&too\n&);
并没有验证出所谓“无效的比较”造成的影响。
测试环境:VS2010
测试代码:
C/C++&code
int&main()
&&&&char&a&=&0x20;
&&&&unsigned&char&b&=&0x20;
&&&&if((a-b)&==&0x00)
&&&&&&&&printf(&----\n&);
&&&&printf(&%d\n&,a-b);
&&&&getchar();
&&&&ret……
char&a&=&0x20值保留的结果与unsigned&char&b&=&0x20结果是一样的,因为它们最高位都是0.
char&a&=&0x80值保留的结果与unsigned&char&b&=&0x80结果是不一样的,因为它们的最高位为1,其a的结果为-128,b的结果为128。
所以,还是整值提升
如果变量无法和常量比较的话,我想这个世界上几乎所有的程序都跑不起来了。同学你还是回去再理解理解左值的定义吧,是不是被别人写的东西绕晕了?
由于a是有符号的,所以a=-128,而b=128
显然a==b不满足条件,1未执行
至于23可以执行是因为溢出后值还是0
45原因也基本同上
楼主搜下下整值提升,C/C++中,当数据类型小于int的类型参加运算之前会先提升为int
比如楼主的例子:
因为a是char类型,b是unsigned&char,两个的数据类型长度都小于int
所以在求表达式a&-&b;之前会首先将a和b都提升为int类型
unsigned&char到int提升时,高位直接补0就好了,&0x80&--&&0x
char提升为int时,具体结果和编译器的实现相关(值保留或者位保留),楼主的编译器是采用的值保留,高位是扩展的符号位,所以0x80&--&&0xffffff80;所以a&-&b&==&256;
原理是这样的,不过&a&-&b&==&256&似乎也不太贴切。我觉得整型提升后的计算应该这么看:
a&-&b&=&0xffffff80&-&0x&=&0xffffff00;
而&aa&=&a&-&b&=&0xffffff00;&所以截断的结果为&0x00。
在比较的时候:
(a-b)&==&0&等效于&0xffffff00&==&0&所以为假。
aa&==&0&等效于&0x00&==&0&所以为真。
4、5这个地方,就是受数据类型的影响,b视为正数所以大于0,a视为负数所以小于0。
详见C++PRIMER。。。不多说了。太多内容了。主要是整形提升
引用&4&楼&we_sky2008&的回复:
楼主搜下下整值提升,C/C++中,当数据类型小于int的类型参加运算之前会先提升为int
比如楼主的例子:
因为a是char类型,b是unsigned&char,两个的数据类型长度都小于int
所以在求表达式a&-&b;之前会首先将a和b都提升为int类型
unsigned&char到int提升时,高位直接补0就好了,&0x80&--&&0……
测试了一下,a=0x40,b=0x40,如你们之前说的那么a=0x40&--&&0xffffff40,b=0x40&--&&0x,那&a&-&b&=&0xffffff00;为啥if((a-b)==0)为真?
测试中看到a-b=0x,在整型提升时a=0x80&--&&0xffffff80,但a=0x40&--&&0xffffff40,是不是不对?
引用&17&楼&wshjldaxiong&的回复:
引用&4&楼&we_sky2008&的回复:
楼主搜下下整值提升,C/C++中,当数据类型小于int的类型参加运算之前会先提升为int
比如楼主的例子:
因为a是char类型,b是unsigned&char,两个的数据类型长度都小于int
所以在求表达式a&-&b;之前会首先将a和b都提升为int类型
unsigned&char到……
有符号数的符号是在最高位上。。
引用&19&楼&celerylxq&的回复:
引用&17&楼&wshjldaxiong&的回复:
引用&4&楼&we_sky2008&的回复:
楼主搜下下整值提升,C/C++中,当数据类型小于int的类型参加运算之前会先提升为int
比如楼主的例子:
因为a是char类型,b是unsigned&char,两个的数据类型长度都小于int
所以在求表达式a&-&b;之前会首先将a和b……
&有符号数的符号是在最高位上。。&和整型提升有什么关系?
测试中看到a-b=0x,在整型提升时a=0x80&--&&0xffffff80,但a=0x40&--&&0xffffff40,是不是不对?
0x40的二进制是
最高为0,哪怕它是有符号类型,仍然提升为
0x80的二进制是
最高为1,当它同时是有符号类型时,才可能提升为
另外,依据标准,char既不同于signed&char,也不同于unsigned&char,是独立的一种类型,但是一般编译器在这种情况下将char默认等同于signed&char。也可以改变默认,比如VC的&/J&编译选项,开启后就默认char为unsigned&char
引用&21&楼&we_sky2008&的回复:
引用&19&楼&celerylxq&的回复:
引用&17&楼&wshjldaxiong&的回复:
引用&4&楼&we_sky2008&的回复:
楼主搜下下整值提升,C/C++中,当数据类型小于int的类型参加运算之前会先提升为int
比如楼主的例子:
因为a是char类型,b是unsigned&char,两个的数据类型长度都小于i……
char类型在有些编译器进行整值提升时,扩展时就是扩展符号位啊
char类型的0x80,二进制是,最高位(符号位)是1
char类型的0x40,二进制是,最高位(符号位)是0
//最简单的可以在你的编译器上这样测试
char&ch1&=&0x80;
char&ch2&=&0x40;
if&(ch1&==&0x80)//ch1的符号位是1,所以扩展为0xffffff80,&0xffffff80与0x当然不相等
&&&&printf(&ch1&==&0x80\n&);
&&&&printf(&ch1&!=&0x80\n&);
if&(ch2&==&0x40)//ch2的符号位是0,所以扩展为0x
&&&&printf(&ch2&==&0x40\n&);
&&&&printf(&ch2&!=&0x40\n&);
学习了,谢谢大虾们
学习了,谢谢大虾们

我要回帖

更多关于 非常污的手机养成游戏 的文章

 

随机推荐