从这个例子中
FileInputStream fis=new FileInputStream("lalu.txt");
int i=0;
while(i=fis.read() !=-1){
System.out.println((char)i);
}
我提出这个问题的目的是为什么char
包含在括号中?
答案 0 :(得分:3)
哇,有些魔法发生在这里?不,它在Java中很常见,称为显式类型转换。为什么字母括在括号中?
强制转换表达式在运行时将一个数字类型的值转换为另一个数字类型的类似值;或者在编译时确认表达式的类型是boolean;或者在运行时检查引用值是指其类与指定引用类型兼容的对象。
括号及其包含的类型有时称为强制转换运算符。
CastExpression:
( PrimitiveType ) UnaryExpression
( ReferenceType ) UnaryExpressionNotPlusMinus
当您将i
声明为int
并将其转换为char
时(在括号中您编写 char ),这意味着您正在执行{{3} }}
根据§5.1.3:
有符号整数到整数类型T的缩小转换只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关幅度的信息之外数值,这可能导致结果值的符号与输入值的符号不同。
默认情况下,int
数据类型是32位带符号的二进制补码整数,char
数据类型是单个16位Unicode字符(引用narrowing primitive conversion),这意味着
因此,当您通过显式转换将整数缩小为字符时,您只需告诉编译器丢弃整数中的前两个字节并处理{{1}作为一个角色!
让我们看一个例子:
i
输出结果为:
打印整数:1100546113
打印int的表示形式:A
这里,我将随机4字节值取为整数int i = 0x41990041; // hex 41990041 is equivalent to decimal 1100546113
System.out.println("printing integer: " + i);
System.out.println("printing char representation of int: " +(char)i);
。仔细观察,在运行时执行转换时将丢弃前两个字节i
,并将最后两个字节4199
打印为字符。请参阅here 0041
值hex
的字符代表为0041
。
答案 1 :(得分:0)
首先它们不是括号,而是括号。
括号在那里因为这是编译器理解你将它投射到其他人的方式。否则会抛出编译时错误。
答案 2 :(得分:0)
括号中的类型名称,后跟变量(例如(char) i
)称为'类型强制转换'。它告诉编译器,"将此变量视为此类型而不是其变量类型",即将i
读为字符而不是整数。您必须以i
为整数开头,因为在到达文件末尾时没有显示编号为-1
的字符。在将其与-1
进行比较后,可以将其转换(更改)为char
,因为这是变量真正代表的内容。例如,如果您文件的第一个字符为'N'
,则i
将设置为'N'
&n; ASCII值,78。(char) i
将78更改回'N'
。在此实例中,System.out.println(i)
会打印78
而不是N
。
为简化起见,这称为类型转换。它告诉编译器将变量读取为不同的类型。
希望这有帮助!