int i = 1;char c= 'b ';
c +=i; //编译通过
c = c + i; //编译错误
为什么啊?
对两个容量不一样的数据类型的变量进行算术运算时,java会自动将小容量的变量进行精度提升,然后再进行运算,得到的结果类型是提升后的大容量的数据类型.如果将该结果赋值给小容量的数据类型的变量,则必须进行强制的类型转换,否则编译程序会报损失精度错.例如:
char c= 'a ';
int i = 5;
首先,因为char类型是16位的,而int类型是32位的,在进行
(c+i) 运算时,自动将c提升到32位,然后与i相加,得到的结果是32位的,而此时
c=c+i; 必然报错,因为如果赋值成功,只是把低16位赋给了c,这个虽然正是楼主想要的结果,但是编译程序却不能判定你的意图是什么.
而这样:
c=(char)(c+i); 就没问题了.
楼上所说的字符和整数不能相加是不对的.java延续了c的习惯,只不过相加之后赋值时要进行类型转换.
至于为什么
c+=i;
能编译通过并得到正确结果,而 c=c+i; 却报错,是因为它们并不像楼主认为的那样是等价的.
java规范中说:
E1 op=E2 实际上等价于 : E1=(T)( (E1)op(E2) )
其中T是E1的数据类型.这种类型转换或者是一个恒等转换,或者是一个窄化转换.
这个说明java是一种强类型的语言,对数据类型的要求是非常严格的,否则会引起混乱.
下面解释一下三种类型转换:恒等转换(相同容量的两个数据类型之间的赋值);拓宽转换(小容量类型赋值给大容量类型);窄化转换(大容量赋值给小容量类型). 实际上,前两种转换都是编译程序自动执行的,而窄化转换则要求必须显式的执行.
如果改一下:i+=c; i=i+c; 则这两个语句都会编译通过,很容易理解.
不知道解释的够不够清楚. :)
分享到:
相关推荐
本文主要讨论了int、char和varchar这三种常见数据类型在性能上的差异。通常,这些差异在无索引和有索引的情况下的表现会有所不同。 首先,从无索引的全表扫描角度来看,测试结果显示int和bigint(即i8)在查询性能...
3. **int**: 在Keil MDK-ARM中,`int`同样占用4个字节(32位),这与32位ARM处理器的字长相匹配。因此,`int`的最大值为2147483647,最小值为-2147483648。 4. **long**: `long`类型在Keil MDK-ARM中也占用4个字节...
这里使用了按位与运算,确保只有最低8位被保留下来。 三、注意问题 1. 范围限制:`char`类型的范围通常是-128到127,如果`int`的值超出了这个范围,转换可能会导致数据丢失或溢出。 2. 字符编码:当处理字符时,...
在Java编程语言中,将整数(Int)转换为字符(Char)是一项常见的任务,特别是在处理数字与字符串混合的数据时。本文将详细介绍三种不同的方法来完成这个转换,并提供相应的Java代码示例。 ### 方法一:使用`switch...
由于xorsum变量默认被提升为int类型后进行运算,所以表达式(xorsum-1)中1的默认类型为int,运算结果为int类型,这导致比较操作出现了问题。正确的做法是使用显式的类型转换,即如文档所示,将结果转换回unsigned ...
在进行运算时,以表达式中最长类型为主,将其他类型位据均转换成该类型,如: (1)若运算数中有double型或float型,则其他类型...(3)若运算数中最长类型为int型,则char型也转换成int型进行运算。算术转换是在运算过程中
void substring(char *s, int pos, int n, char *t);//求主串s中从pos位置开始连续n个字符构成的子串t int search( char *s, char *t);//返回子串t在主串s中出现的位置下标,若不存在返回-1 void replace(char *s, ...
这篇文章通过两个实际的例子深入浅出地讲解了`unsigned int`运算中的陷阱,帮助程序员理解这类问题并避免潜在的错误。 首先,我们要明白`unsigned int`和`int`的主要区别。`unsigned int`是一种无符号整型,只能...
7算术运算包括字符串到浮点数、浮点数到字符串的转换,加、减、乘、除四则运算等。要有说明文档,包括算法证明、程序框图、使用方法、特殊处理(溢出、数位扩展)、实例分析等等。字符串转换可能稍难。typedef ...
int main(int argc, char* argv[]) { int b=3; int arr[] = {6, 7, 8, 9, 10}; int *ptr = arr; *(ptr++) += 123; printf("%d, %d\n", *ptr, *(++ptr)); return 0; } ``` **知识点解析:** - `*(ptr++)` 表示...
在C语言中,`char`、`short`和`int`是三种基本的整数类型,它们各自有特定的数值范围。理解这些类型的范围对于编写高效且无错的C程序至关重要。下面我们将深入探讨这些数据类型及其在C语言中的应用。 `char`类型在...
根据给定的信息,本文将详细解释四则混合运算在C语言中的实现方法,涉及的知识点主要包括数据结构的设计、栈的应用以及具体的算法...通过合理设计数据结构以及实现相应的操作函数,我们可以有效地解决四则运算的问题。
C语言虽然没有内置的大数处理库,但通过自定义数据结构和算法,我们可以实现大数的存储与计算。 ### 1. 大数的存储 大数的存储通常采用数组或链表的形式,这里我们以数组为例。数组的每个元素代表大数的一个位,...
该类支持char*、string、int三个类型之间的转换,可以满足各种大数运算的需求。 重载符号 该头文件重载了以下符号: * `+`:加法运算符 * `-`:减法运算符 * `*`:乘法运算符 * `/`:除法运算符 * `%`:余数...
char* str_result = xint_to_string(&result); printf("Result: %s\n", str_result); // 清理资源 xint_clear(&num1); xint_clear(&num2); xint_clear(&result); ``` 这段代码展示了如何初始化XINT对象,从字符串...
根据给定的文件标题“复数运算问题 简单的C语言练习”以及描述“复数运算问题 简单的C语言练习 可以作为刚学C语言同学的练习”,我们可以看出这是一个关于复数运算的基础性练习程序,旨在帮助初学者掌握C语言中的...
### C高级语言程序设计:算术运算与逻辑运算 #### 运算符概述 C语言提供了多种运算符来处理各种计算需求,主要包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符、逗号运算符、指针运算符...
例子:爪哇// Java Program to Convert Char to Int// Using Character.getNumericValue() methodclass GFG { // Main driver method public static void main(String[] args) { // Declaring and initializing a ...
- `int Operate(int x, char opr, int y);` - 对于给定的操作数 `x` 和 `y`,以及运算符 `opr`,执行相应的运算操作并返回结果。 ### 主函数流程分析 在主函数 `void main()` 中,程序首先创建了两个栈 `sdata` ...
为了解决这个问题,本文介绍了一种快速的小数运算算法,使用 16 位定点小数在 Keil C51 中实现高速的小数运算。 1. 定点小数运算算法 在实时控制系统中,控制算法通常可以用差分方程表示,计算机实时控制系统中的...