C:int a[4]
java: int [4] a
int是4个字节,假设一个int的4个字节是abcd,转为byte数组byte[4]。则存为b[0]=a,b[1]=b,b[2]=c,b[3]=d
另外注意:类型转换的原则是值不变,所以000a转为byte是a,a000转成byte无法转成a。
如果从char转为usigned char 。可能值会变。当大小一样时,转的时候原则是保持内存内容不变,因为此时不需要补也不需要删(需要补或者删的时候就好考虑使得值不变)。char转为 usigned char时告诉系统第一位不再是符号位,也是值位。int和unsigned int 也是,互转不会溢出
----------------------一下引至网友----------
unsigned 就是第一个符号位也用来作为数据的保存位,
int ---》 unsigned int,如果是负数的话,由于第一个是符号位1,所以转换之后的结果就和原来的数不一样了。 如果是整数,原来的符号位是0,结果没有变化 unsigned int ---> int ,同上考虑
int ---》 unsigned int,如果是负数的话,由于第一个是符号位1,所以转换之后的结果就和原来的数不一样了。 如果是整数,原来的符号位是0,结果没有变化 unsigned int ---> int ,同上考虑
----------------------------------------------
public static byte[] intToByteArray1(int i) {
//必须把我们要的值弄到最低位去,有人说不移位这样做也可以,
result[0] = (byte)(i & 0xFF000000);
//,这样虽然把第一个字节取出来了,但是若直接转换为byte类型,会超出byte的界限,出现error。再提下数//之间转换的原则(不管两种类型的字节大小是否一样,原则是不改变值,内存内容可能会变,比如int转为//float肯定会变)所以此时的int转为byte会越界,只有int的前三个字节都为0的时候转byte才不会越界。虽//然
result[0] = (byte)(i & 0xFF000000);
这样不行,但是我们可以这样
result[0] = (byte)((i & //0xFF000000)
>>24);
result[1] = (byte)((i >> 16) & 0xFF);
result[2] = (byte)((i >> 8) & 0xFF);
result[3] = (byte)(i & 0xFF);
return result;
}
}
public static int byteArrayToInt(byte[] b, int offset) {
int value= 0;
for (int i = 0; i < 4; i++) {
int shift= (4 - 1 - i) * 8;
value +=(b[i + offset] & 0x000000FF) << shift;//往高位游
}
return value;
}
关于byteArrayToInt有必要再写一种
public static int byteArrayToInt(byte[] b, int offset) {
int value= 0;
for (int i = 0; i < 4; i++) {
value|=b[i];
value=value<<8;
}
return value;
}
以下是C语言:
先说个上次看到的运算符:~按位取反,^按位异或
关于位移运算符还得说明:
<<左移,这没啥好说的,右边补0
>>右移,(左边在java中,正数补0,负数补1)
应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
-1的8位补码表示是1111 1111,此时如果是补1的系统,则移任意次值不会变还是-1
整数比特反转
int reverse(int m)
{
{
int result=0;
int tmp=0;
//while(m){//这里要看是那种编译系统,有的编译系统负数向右移位操作左边补1,这时候这里就会有问题了,最终是移为-1的。
for(int i=0;i<8;i++){
int tmp=m&1;//取m的最低位看是0还是1
result|=tmp;
result<<1;
m>>1;
}
}