首页 > 试题广场 >

执行如下程序代码

[不定项选择题]
执行如下程序代码
char chr = 127;
int sum = 200;
chr += 1;
sum += chr;
后,sum的值是()
备注:同时考虑c/c++和Java的情况的话
  • 72
  • 99
  • 328
  • 327
java中只有byte, boolean是一个字节, char是两个字节, 所以对于java来说127不会发生溢出, 输出328
但是对于c/c++语言来说, char是一个字节, 会发生溢出, 对127加一发生溢出,  0111 1111 --> 1000 0000, 1000 0000为补码-128, 所以结果为200-128=72
发表于 2019-10-17 09:32:31 回复(22)

因为char类型的数据范围为0到127,127+1超过了这个范围,而127的二进制为01111111,加1后按照有符号输出就为-128,所以200-128=72


发表于 2019-08-26 23:53:13 回复(5)
对于c/c++语言来说:char是一个字节,第一位是符号位,chr在计算机中是补码形式存储,而正数的补码就是原码本身:0111 1111,chr+=1后,chr变为1000 0000,实际上已经溢出了,sum在计算机中存储形式是(假设当前编译器int为16位):0000 0000 1100 1000接着算sum += chr,sum是16位的而chr是8位的,chr会自动转成16位的,按照按符号位扩展规则,前面补1111 1111,chr变成了1111 1111 1000 0000,于是在计算机内部是0000 0000 1100 1000和1111 1111 1000 0000相加,得到(1)0000 0000 0100 1000 ,第一个1舍去,1001000是72。但是对于我们来说不需要了解那么多,知道补码1000 0000代表-128,200-128=72就完事了。
编辑于 2020-04-07 23:02:34 回复(0)

明确俩点:
在Java中,char是双字节的;而在C++中,char是单子节的

发表于 2019-10-06 21:32:19 回复(0)
看代码 . java 答案是 328

编辑于 2019-08-26 10:36:12 回复(11)
我只选了C/C++居然给我出这道题。。。
发表于 2019-10-10 20:31:23 回复(2)
这道题用到了计算机组成原理的知识,char类型单字节最多表示128个字符,从0~127,加一后成了128,此时与int类型相加,扩充成了4字节。利用补码加法可得答案
发表于 2019-08-24 19:22:56 回复(1)
java中只有byte, boolean是一个字节, char是两个字节, 所以对于java来说127不会发生溢出, 输出328
但是对于c/c++语言来说, char是一个字节, 会发生溢出, 对127加一发生溢出,  0111 1111 --> 1000 0000, 1000 0000为补码-128, 所以结果为200-128=72
发表于 2022-03-07 17:32:41 回复(0)
char在java是两个字节,所以加一为128没问题,可是在c中是一个字节即8位。所以会变成负的
发表于 2019-09-28 15:43:58 回复(0)
没仔细看题,ovo
备注:同时考虑c/c++和Java的情况的话
要考虑c/c++的情况:char是一个字节,发生溢出,对127+1 -> -128   200-128 = 72
这题AC都是正确的,小伙伴们一定要仔细看题,可不能和我一样马虎哦
发表于 2022-03-25 14:31:21 回复(0)
c/c++的char取值是-128~127,127+1超出范围,变成-128。所以sum最终结果为72。 Java全忘了😂
发表于 2022-02-13 14:27:58 回复(0)
java中只有byte, boolean是一个字节, char是两个字节, 所以对于java来说127不会发生溢出, 输出328
但是对于c/c++语言来说, char是一个字节, 会发生溢出, 对127加一发生溢出
发表于 2021-11-03 08:26:32 回复(0)
. 8 7 6 5 4 3 2 1
二进制数 0/1 1 1 1 1 1 1 1
换算数 +/- 64 32 16 8 4 2 1

原码以左边第一位为表示正负的符号位:
0111 1111 = +(64+32+16+8+4+2+1) = +127

java里的byte进行+=运算也会溢出到符号位:
0111 1111 + 1 = 1000 0000

反码——将0变成1,1变成0,符号位不变:
1000 0000 = 1111 1111

补码——向前挪一位,在换算成10进制后再-1:
1111 1111 -> -(64+32+16+8+4+2+1)-1 = -128

为什么是要减1?
因为0000 0000代表0,1000 0000代表-1,负数以-1为起始而非-0,所以要多减一。

为什么要补码等等问题,可以看看这个牛V的知乎回答!超赞的!

编辑于 2020-08-19 11:30:08 回复(0)
发表于 2019-08-30 08:47:09 回复(1)
发表于 2022-08-11 20:45:43 回复(0)
c也么样和我一个java程序员有啥关系
发表于 2021-10-03 16:03:47 回复(0)
1.在java中:char是两个字节(byte)(-32768~32768) int是四个字节,在进行加法时考虑char自动向上转型为四个字节。同时java中的char为128没有溢出,所以正常加200,结果等于3282.在c++中:char是一个字节(byte),范围是(-128~127),显然char为127满再加一会溢出注:0111 1111 加1 10000 0000为-128所以最后结果为200+(-128)=72
发表于 2021-03-03 13:35:23 回复(0)

答案:AC

在 C++ 中,char 类型占一个字节,也就是八位,有符号数在计算机中以补码的形式存放,因此 char 类型能存放的范围为 -128~127,127 对应的补码为 0111 1111,加 1 后为 1111 1111,符号位变为 1,表示负数,对应的值为 -128,所以最后 sum 的值为 72。

在 Java 中,char 类型占两个字节,能表示的范围为 -65536~65535,不会发生溢出,所以最后 sum 的值为 328。

编辑于 2020-06-26 02:05:13 回复(1)
还能说什么
发表于 2019-11-10 22:00:03 回复(0)
Java 代码实现结果:


同时考虑 C/C++ 的话

C 代码:

C语言的结果是72 ……
发表于 2019-10-31 10:19:40 回复(1)