Java有符号的byte传递给C/C++层的char/unsigned char会发生什么?

文章目录

  • Java中的byte
    • 来看看java中byte的数值范围
  • C/C++的char
  • 把Java的byte传递到C/C++的char/unsigned char
    • Java层
    • JNI层
    • 打印结果

Java中的byte

byte是一种数据类型,用于表示8位二进制补码数,范围为-128到127。在Java中,byte数据类型使用一个字节的存储空间,因此可以用来在内存中节省空间。byte在处理图像、音频和网络数据等二进制数据时经常使用。通常,byte类型用于存储字节数据,例如从文件或网络流中读取的数据。

来看看java中byte的数值范围

一个字节(byte)是2的8次方,2的8次方转为十进制就是255。
由于java的byte是有符号的,我们来看看假如然数值超出byte的范围,会打印什么数值:

  for (int i = 0; i < 300; i++) {
            byte b = (byte) i;
            System.out.println("i = " + i + " b = " + b );
  }
i = 0 b = 0
i = 1 b = 1
i = 2 b = 2
i = 3 b = 3
i = 4 b = 4
i = 5 b = 5
i = 6 b = 6
i = 7 b = 7
i = 8 b = 8
i = 9 b = 9
i = 10 b = 10
i = 11 b = 11
i = 12 b = 12
i = 13 b = 13
i = 14 b = 14
i = 15 b = 15
i = 16 b = 16
i = 17 b = 17
i = 18 b = 18
i = 19 b = 19
i = 20 b = 20
i = 21 b = 21
i = 22 b = 22
i = 23 b = 23
i = 24 b = 24
i = 25 b = 25
i = 26 b = 26
i = 27 b = 27
i = 28 b = 28
i = 29 b = 29
i = 30 b = 30
i = 31 b = 31
i = 32 b = 32
i = 33 b = 33
i = 34 b = 34
i = 35 b = 35
i = 36 b = 36
i = 37 b = 37
i = 38 b = 38
i = 39 b = 39
i = 40 b = 40
i = 41 b = 41
i = 42 b = 42
i = 43 b = 43
i = 44 b = 44
i = 45 b = 45
i = 46 b = 46
i = 47 b = 47
i = 48 b = 48
i = 49 b = 49
i = 50 b = 50
i = 51 b = 51
i = 52 b = 52
i = 53 b = 53
i = 54 b = 54
i = 55 b = 55
i = 56 b = 56
i = 57 b = 57
i = 58 b = 58
i = 59 b = 59
i = 60 b = 60
i = 61 b = 61
i = 62 b = 62
i = 63 b = 63
i = 64 b = 64
i = 65 b = 65
i = 66 b = 66
i = 67 b = 67
i = 68 b = 68
i = 69 b = 69
i = 70 b = 70
i = 71 b = 71
i = 72 b = 72
i = 73 b = 73
i = 74 b = 74
i = 75 b = 75
i = 76 b = 76
i = 77 b = 77
i = 78 b = 78
i = 79 b = 79
i = 80 b = 80
i = 81 b = 81
i = 82 b = 82
i = 83 b = 83
i = 84 b = 84
i = 85 b = 85
i = 86 b = 86
i = 87 b = 87
i = 88 b = 88
i = 89 b = 89
i = 90 b = 90
i = 91 b = 91
i = 92 b = 92
i = 93 b = 93
i = 94 b = 94
i = 95 b = 95
i = 96 b = 96
i = 97 b = 97
i = 98 b = 98
i = 99 b = 99
i = 100 b = 100
i = 101 b = 101
i = 102 b = 102
i = 103 b = 103
i = 104 b = 104
i = 105 b = 105
i = 106 b = 106
i = 107 b = 107
i = 108 b = 108
i = 109 b = 109
i = 110 b = 110
i = 111 b = 111
i = 112 b = 112
i = 113 b = 113
i = 114 b = 114
i = 115 b = 115
i = 116 b = 116
i = 117 b = 117
i = 118 b = 118
i = 119 b = 119
i = 120 b = 120
i = 121 b = 121
i = 122 b = 122
i = 123 b = 123
i = 124 b = 124
i = 125 b = 125
i = 126 b = 126
i = 127 b = 127
i = 128 b = -128
i = 129 b = -127
i = 130 b = -126
i = 131 b = -125
i = 132 b = -124
i = 133 b = -123
i = 134 b = -122
i = 135 b = -121
i = 136 b = -120
i = 137 b = -119
i = 138 b = -118
i = 139 b = -117
i = 140 b = -116
i = 141 b = -115
i = 142 b = -114
i = 143 b = -113
i = 144 b = -112
i = 145 b = -111
i = 146 b = -110
i = 147 b = -109
i = 148 b = -108
i = 149 b = -107
i = 150 b = -106
i = 151 b = -105
i = 152 b = -104
i = 153 b = -103
i = 154 b = -102
i = 155 b = -101
i = 156 b = -100
i = 157 b = -99
i = 158 b = -98
i = 159 b = -97
i = 160 b = -96
i = 161 b = -95
i = 162 b = -94
i = 163 b = -93
i = 164 b = -92
i = 165 b = -91
i = 166 b = -90
i = 167 b = -89
i = 168 b = -88
i = 169 b = -87
i = 170 b = -86
i = 171 b = -85
i = 172 b = -84
i = 173 b = -83
i = 174 b = -82
i = 175 b = -81
i = 176 b = -80
i = 177 b = -79
i = 178 b = -78
i = 179 b = -77
i = 180 b = -76
i = 181 b = -75
i = 182 b = -74
i = 183 b = -73
i = 184 b = -72
i = 185 b = -71
i = 186 b = -70
i = 187 b = -69
i = 188 b = -68
i = 189 b = -67
i = 190 b = -66
i = 191 b = -65
i = 192 b = -64
i = 193 b = -63
i = 194 b = -62
i = 195 b = -61
i = 196 b = -60
i = 197 b = -59
i = 198 b = -58
i = 199 b = -57
i = 200 b = -56
i = 201 b = -55
i = 202 b = -54
i = 203 b = -53
i = 204 b = -52
i = 205 b = -51
i = 206 b = -50
i = 207 b = -49
i = 208 b = -48
i = 209 b = -47
i = 210 b = -46
i = 211 b = -45
i = 212 b = -44
i = 213 b = -43
i = 214 b = -42
i = 215 b = -41
i = 216 b = -40
i = 217 b = -39
i = 218 b = -38
i = 219 b = -37
i = 220 b = -36
i = 221 b = -35
i = 222 b = -34
i = 223 b = -33
i = 224 b = -32
i = 225 b = -31
i = 226 b = -30
i = 227 b = -29
i = 228 b = -28
i = 229 b = -27
i = 230 b = -26
i = 231 b = -25
i = 232 b = -24
i = 233 b = -23
i = 234 b = -22
i = 235 b = -21
i = 236 b = -20
i = 237 b = -19
i = 238 b = -18
i = 239 b = -17
i = 240 b = -16
i = 241 b = -15
i = 242 b = -14
i = 243 b = -13
i = 244 b = -12
i = 245 b = -11
i = 246 b = -10
i = 247 b = -9
i = 248 b = -8
i = 249 b = -7
i = 250 b = -6
i = 251 b = -5
i = 252 b = -4
i = 253 b = -3
i = 254 b = -2
i = 255 b = -1
i = 256 b = 0
i = 257 b = 1
i = 258 b = 2
i = 259 b = 3
i = 260 b = 4
i = 261 b = 5
i = 262 b = 6
i = 263 b = 7
i = 264 b = 8
i = 265 b = 9
i = 266 b = 10
i = 267 b = 11
i = 268 b = 12
i = 269 b = 13
i = 270 b = 14
i = 271 b = 15
i = 272 b = 16
i = 273 b = 17
i = 274 b = 18
i = 275 b = 19
i = 276 b = 20
i = 277 b = 21
i = 278 b = 22
i = 279 b = 23
i = 280 b = 24
i = 281 b = 25
i = 282 b = 26
i = 283 b = 27
i = 284 b = 28
i = 285 b = 29
i = 286 b = 30
i = 287 b = 31
i = 288 b = 32
i = 289 b = 33
i = 290 b = 34
i = 291 b = 35
i = 292 b = 36
i = 293 b = 37
i = 294 b = 38
i = 295 b = 39
i = 296 b = 40
i = 297 b = 41
i = 298 b = 42
i = 299 b = 43
System.out.println("0x90 = " + 0x90);
System.out.println("强转0x90 = " + (byte)0x90);

打印:

0x90 = 144
强转0x90 = -112

C/C++的char

C语言中没有byte类型,但是可以使用"unsigned char"来代替。unsigned char是一个无符号的8位整数,其范围是从0到255。在C语言中,我们可以使用十六进制来表示一个byte,例如0x90表示十进制的144,即unsigned char类型中的一个值。

以下是一个将整数转换为unsigned char类型的示例:

int num = 144; // 十进制的144
unsigned char b = (unsigned char) num;

printf("%d\n", b); // 输出144

在这个例子中,我们将整数144强制转换为unsigned char类型,它的二进制表示为10010000,即0x90。我们可以通过printf函数将其输出到终端。

需要注意的是,如果将一个大于255的整数转换为unsigned
char类型,它将被截断为其最低的8位。例如,如果将300转换为unsigned
char类型,它将被截断为44,因为300的二进制表示为100101100,截断后的二进制表示为00101100,即十进制的44。
这一点是和java的byte是一样的,超出范围会被截断。

把Java的byte传递到C/C++的char/unsigned char

Java层

native方法定义:

public native byte passByte(byte b);

Java调用:

byte javaByte = (byte) 0x90;
System.out.println("javaByte = " + javaByte);
byte returnB = lib.passByte(javaByte);
System.out.println("Java文件,returnB = " + returnB);

JNI层

extern "C"
JNIEXPORT jbyte JNICALL
Java_com_xxx_nativelib_NativeLib_passByte(JNIEnv *env, jobject thiz, jbyte b) {
    //获取参数b,并打印
    LOGD("cpp文件,赋值为jbyte : b = %d", b);

    //把b转为C++的char类型
    char c = b;
    //打印c
    LOGD("cpp文件,赋值为char : c = %d", c);

    //把b转为C++的char类型
    unsigned char uc = b;
    //打印c
    LOGD("cpp文件,赋值为unsigned char uc = %d", uc);
    return b;
}

打印结果

javaByte = -112
cpp文件,赋值为jbyte : b = -112
cpp文件,赋值为char : c = 144
cpp文件,赋值为unsigned char uc = 144
Java文件,returnB = -112

可以看到,Java把byte赋值给C/C++层的时候,byte的有符号会自动转变为无符号。
从C/C++层返回给Java层的时候,无符号又会自动转为有符号。

你可能感兴趣的:(JNI,java,c语言,c++)