(byte)0xaa 0xff

final byte[] datas = {(byte)0xaa };
byte aa= 0xff; 用int表示为-1
内存里的数是用补码存储的
正数的补码=正数本身
负数的补码=负数的绝对值按位取反后再加1
char duan定义的是一个字节的有符号数
0xff在内存中是11111111,最高位是1,说明是负数
按负数补码的定义,11111111-1=11111110
再按位取反=00000001
最后前面加是“-”,结果为-1

 

 

 

 

Java中的基本类型

java中所有的基本数值类型都有正负号,所以不要去寻找无符号的数值类型。

基本类型大小最小值最大值包装器类型
boolean----
char16-bit  Character
byte8 bits-128127Byte
short16 bits-2^152^15-1Short
int32 bits-2^312^31-1Integer
long64 Bits-2^632^63-1Long
float32 bitsIEEE754IEEE754Float
double64 bitsIEEE754IEEE754Double
void---Void

高精度数字: 
- BigInteger 支持任意精度的整数 
- BigDecimal 支持任何精度的浮点数

java中的基本类型的强制转换都是非常粗暴的,对于浮点型转为整型,都进行非常粗暴的截尾,对于多位数转换为少位数,也只是截断,根本不做舍入和约算。所以就有了下面的结果。

基本类型的强制转换典型笔试面试题

package primitiveType;

public class ByteTrancute {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        byte a=(byte)127;
        byte b=(byte)128;
        byte c=(byte)100;
        int  x=0xff;//255
        byte d=(byte)x;
        x=0x80;//128
        byte f=(byte)x;
        c=(byte)(c*3);
        System.out.println(a+" "+b+" "+c+" "+d+" "+f );
    }

}

输出:

127 -128 44 -1 -128

分析

复习二进制的知识

原码

对于二进制数,最高位为符号位,0表示正数,1表示负数,剩余数值部分是真值。

反码

对于二进制数,正数的反码就是它本身,负数的反码除符号位外按位取反。

补码

对于二进制数,正数的补码就是它本身,负数的补码符号位取一,数值部分按位取反后末位加一。
  •  

由补码求真值,就是由补码求原码

正数:补码即原码
负数:按位取反,末位加一。相当于再求一次补码。
如:
1000 0000 计算得 1 0000 0000 视为-128
1111 1111 计算得   1000 0001 即系-1
0111 1111 就是正值 127

所以,以上的代码中的类型强制转换结果为:

int32bits二进制截成8bits后byte
1270111 11110111 1111127
1281000 00001000 0000-128
2551111 11111111 1111-1
1270111 11110111 1111127
30001 0010 11000010 110044
// 引入系统头文件 #include "system.h" // 引入STC8A8K64S4A12芯片的头文件 #include "stc8a8k64s4a12.h" // 引入Timer0头文件 #include "Timer0.h" // 定义P3^4为按键K1 sbit K1=P3^4; // 初始化串口 void Init_Serial(void) { SCON=0X50; // 设置串口为工作模式1,8位数据,可变波特率 PCON=0X80; // 波特率加倍 ES=1; // 使能串口中断 EA=1; // 使能总中断 TMOD=0X20; // 设置Timer1为工作模式2 TL1=243; //9600波特率下,Timer1初值为243 TH1=243; // 9600波特率下,Timer1重载值为243 TR1=1; // 启动Timer1 } // 串口发送一个字节 void UART_SendByte(unsigned char Byte) { SBUF=Byte; // 把数据保存到SBUF寄存器 while(TI==0); // 等待发送完成 TI=0; // 清除中断标志位 } void main() { System_Init(); // 系统初始化 P3_Mode_PullUp(PIN_0|PIN_1); // 设置P3.0和P3.1为上拉输入模式 P0_Mode_OUT_PP(0XFF); // 设置P0口为输出模式 Init_Serial(); // 初始化串口 Timer0Init(); // 初始化定时器0 while(1) { // 主循环 } } // 定时器0中断服务函数 void Timer0_Poutine() interrupt 1 { static unsigned int T0Count; // 定义静态变量,用于计数 TL0=(65536-3)%256; // 设置定时器0初值 TH0=(65536-3)/256; // 设置定时器0重载值 P0=~P0; // 取反P0口状态 UART_SendByte(0xaa); // 发送0xaa,用于测试 } // 串口中断服务函数 void s_int(void) interrupt 4 { if(TI==1) { // 判断是否为发送中断 TI=0; // 清除中断标志位 } if(RI==1) { // 判断是否为接收中断 RI=0; // 清除中断标志位 if(SBUF==0XAA){P2=0XFE;} // 如果收到0xaa,P2口输出0xFE if(SBUF==0X55){P2=0XFF;} // 如果收到0x55,P2口输出0xFF UART_SendByte(SBUF); // 发送接收到的数据 } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值