keil中 c语言中的强制转换符问题

比如定义 uint i;
uchar j;
为什么 i = (uint) j;可以通过
而 j = (uchar)i;却不可以通过呢?
是double>float>char>int的原因?
我记得强制转换貌似可以转换任何你想要的形式啊,请高手解答!!

C语言中强制数据类型转换的总结

● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char型对待, 取值范围总是0~255)。
● 如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。
double ←—— float 高

long

unsigned

int ←—— char,short 低
● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型,然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的,使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。
● 当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。

赋值中的类型转换

当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。具体的转换如下:
(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型变量时, 内部存储形式不变,但外部表示时总是无符号的。
/*例:赋值运算符举例 */
main()
{ unsigned a,b;
int i,j;
a=65535;
i=-1;
j=a;
b=i;
printf("(unsigned)%u→(int)%d\n",a,j);
printf("(int)%d→(unsigned)%u\n",i,b);
}
运行结果为:
(unsigned)65535→(int)-1
(int)-1→(unsigned)65535

● 计算机中数据用补码表示,int型量最高位是符号位,为1时表示负值,为0时表示正值。如果一个无符号数的值小于32768则最高位为0,赋给 int型变量后、得到正值。如果无符号数大于等于32768,则最高位为1,赋给整型变量后就得到一个负整数值。反之,当一个负整数赋给unsigned 型变量时,得到的无符号值是一个大于32768的值。
● C语言这种赋值时的类型转换形式可能会使人感到不精密和不严格,因为不管表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。
● 而转变后数据可能有所不同,在不加注意时就可能带来错误。 这确实是个缺点,也遭到许多人们批评。但不应忘记的是:c面言最初是为了替代汇编语言而设计的,所以类型变换比较随意。当然, 用强制类型转换是一个好习惯,这样,至少从程序上可以看出想干什么。

参考资料:http://blog.chinaunix.net/u/23275/showart.php?id=483756

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-02-22
keil不是标准C 很多地方都不一样

你这样写是没问题的 (标准C下面)

不能通过 你看下是不是 在进行操作语句之后又声明了变量比如
uint i;
i = 0;
uchar j;
这样都不能通过 要把所以的变量声明放在最前面

拿代码说问题
有可能是keil的问题 也可能是你自己写的问题本回答被提问者采纳
第2个回答  2020-12-26

第3个回答  2009-08-07
上面已经回答的不错了。

keil中 c语言中的强制转换符问题
这些转换可以说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。● 当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。赋值中的类型转换 当赋值运算符两边的运算对象类型不同时,将要发生类型...

关于keil中c语言强制类型转换的奇怪问题
但从这部分我感觉是没有问题的,是不是你的dataprocess的形参数据类型有问题?Keil软件不敢说很强大,但是使用的人应该很多,这样简单的问题不应该有错,我使用Keil有几年的时光了,也做过你这样的类型转换,但是没有你说的这样的问题;方法有两个,你直接将变量num赋值123试试呢?还有就是你仿真一下...

关于keil中c语言强制类型转换的奇怪问题
但从这部分我感觉是没有问题的,是不是你的dataprocess的形参数据类型有问题?Keil软件不敢说很强大,但是使用的人应该很多,这样简单的问题不应该有错,我使用Keil有几年的时光了,也做过你这样的类型转换,但是没有你说的这样的问题;方法有两个,你直接将变量num赋值123试试呢?还有就是你仿真一下...

求教关于keil的数据类型准换的问题
unsigned 赋值 signed 会按直接赋值,即在存储上是一致的,按你的问题就是“会变成负数”强制类型转换除了存储单元的大小差别(比如int 赋值给char会丢失高8bit)外,都直接存储内容赋值吧,赋值后的值根据新的类型去定。char i = -1;\/\/ (i = 0xff)unsigned char j = (unsigned char)(i);\/\/...

C语言强制类型转换问题
具体是这样操作的,从b所对应的存储空间中取出 b的值即0x1234,然后把他转换成char类型,再然后将 转换后的结果放到变量a所对应的存储空间,即覆盖掉 原来的0000 这个转换后的结果又是多少呢,是这样算的 通常在C中int类型占4个字节 而char类型占1个字节 如果把一个int类型的数据以char类型输出,...

...乘法问题 急死我了,我用的是WIN7系统,使用KEIL编译,现在做一个两...
应该是溢出了,两个数最大为255时,乘积最大为65535,结果需要一个16位的无符号整数才能保存,当乘数再大时,保存结果的数需要定义为更大一点的整型,如long

keil中,或运算和不等于,或|| !! != |= 哪个对?
[pre]C 语言中,逗号(,)也可以是运算符,称为逗号运算符(Comma Operator)。逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式,称为逗号表达式。其一般形式为:子表达式1, 子表达式2, ..., 子表达式n 例如:a + b, c = b, c++ 逗号运算符的优先级是所有运算符中级别最低的...

我用KEIL编C语言的程序,用到了一个atoi函数,但在LCD上显示不出来,如果...
因为不清楚你的具体需求,不好回答。我首先假设内存足够大(至少1K),不是特别差的51、31系列单片机。需求是把a142这个16进制数?转换成10进制数输出?前面 char str[4]={“a142"};是完全错误的 应当是 char str[]="a142"; 或者 char str[5]="a142";后面 最简单的就是 sscanf(str, "%x...

C语言 keil中的错误 高手啊
C语言 keil中的错误 高手啊 error C300: unterminated comment这是什么错误怎么修改 opopnjf | 浏览997 次 |举报 我有更好的答案推荐于2017-12-16 12:29:51 最佳答案 应该是注释错了,检查下有没有\/*却没有用*\/结尾。如果你是复制的其他地方的代码也可能是编码有问题。 来自:求助得到的回答 本回答由...

keil c中如何把字符串转化为整型 具体一点
【答案】:可以使用sscanf,就像sprintf将整型数转换成字符串输出一样,逆运算(KEILC 中scanf和printf确定了通过单片机串行口完成输入输出模式,除非做了修改,一般实际中不用)。给你个例子: unsigned char string[5]={'1234'}; unsigned int n; sscanf(string,'%u',&n); \/\/string是字符串,%u...

相似回答