你能猜到答案吗?高手快过来显露一下

海枫
博客专家认证
2010-12-20 09:53:35

#include <stdio.h>

int main()
{
signed char n = -128;
signed char p = 0 -n;

printf("n = %d, p = %d\n", n, p);
return 0;
}


你能不运行上面代码猜到结果吗? 不要急于去运行来获知答案。 如果你实在想不出来,可以行运一下,对运行的结果,你能想出原因吗?

上面的代码是我们在项目中检测到的一个问题。
...全文
420 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjbwj006 2010-12-22
  • 打赏
  • 举报
回复
-128 -128
houzhenghui123 2010-12-22
  • 打赏
  • 举报
回复
上溢出变成最小
下溢出变成最大
刚学的组成原理
shiter 2010-12-22
  • 打赏
  • 举报
回复
有点意思。。。。
zanglengyu 2010-12-22
  • 打赏
  • 举报
回复
-128
海枫 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 my_live_123 的回复:]

新版本vs的采用国际的Unicode字符标准,不再是小范围的ASCII,那么你这个问题应该是另一种答案!
[/Quote]

看清楚拉,这样是关于unsigned char 能表示整数的范围的一个问题。 与unicode是无关的。
海枫 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 xiaozhuhaoa 的回复:]

感觉意思不大,不安全的,用int比较好
[/Quote]

这不是unsigned char的问题,是补码的问题。 int一样有这个问题,不信可以看:


#include <stdio.h>

int main()
{
int n = 0x80000000;
int p = 0 - n;

printf("n = %d, p = %d\n", n, p);

return 0;
}
zyyoung 2010-12-21
  • 打赏
  • 举报
回复
unsigned char n = -128;
unsigned char p = 0 -n;
printf("n = %d, p = %d\n", n, p);

知道是多少吗
zlmumianhua 2010-12-21
  • 打赏
  • 举报
回复
-128吧
csdn一绝 2010-12-21
  • 打赏
  • 举报
回复
计算机是以char类型长度8位的最高位是否为0和1来辨别是正或负,10000000 让计算机看的话就是 先看最高位,是个1 首先说明是负数,然后10000000也是整数 128,以%d输出时 给添个'-'符号就行了 -128
小猴饲养员 2010-12-21
  • 打赏
  • 举报
回复
都是-128
-128的二进制为 1000 0000
对于有符号类型,二进制首位表示正负,绝对值为 二进制取反加一 = 1111 1111 = -128
0-(-128) = 127 + 1 = 0111 1111 +0000 0001=1000 0000

aihuan959 2010-12-21
  • 打赏
  • 举报
回复
我都不知道singed char范围是多少...平时用到一次测一次....
csdn一绝 2010-12-21
  • 打赏
  • 举报
回复
正确输出如下:
n = -128, p = -128

组成原理
char 的范围 -128 ~ 127
-128在计算机的二进制表示为10000000,解释下,负数在计算机的二进制表示为补码,10000000为128,取反后为01111111,加1后为10000000 以整数形式输出的
0-(-128)=128的二进制为10000000

longmo1212 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 baolongbao 的回复:]
n=-128
p=-128
char的范围是-128~127,所以n=-128,二进制表示为11111111,
0-n,的值为128,超出了char的范围,二进制表示依然为11111111,
将char按int输出,所以都是-128
[/Quote]
支持
未注销 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 guyuxiangtheone 的回复:]

大学 别翘课 就都知道了 这用得着高手么??
[/Quote]哈哈。
xiaozhuhaoa 2010-12-21
  • 打赏
  • 举报
回复
感觉意思不大,不安全的,用int比较好
wudizuijimo 2010-12-21
  • 打赏
  • 举报
回复
都是-128吧
jikeyuan1 2010-12-21
  • 打赏
  • 举报
回复
组成原理的知识
suyumo1991 2010-12-21
  • 打赏
  • 举报
回复
哈哈哈哈,学以致用,将%d变成%c后,结果是有点像大写的C....有意思...
qq120848369 2010-12-20
  • 打赏
  • 举报
回复
溢出了,也就没意义解释这个问题了.

因为char规定最高位是符号位,所以符号是由最高位决定的,而char的数值部分大小却把char整个8位全部当做数值,这是很纠结的规定,溢出就不要再讨论了.
zzPandazz 2010-12-20
  • 打赏
  • 举报
回复
gcc: n = -128, p = -128
和我猜想的一样
加载更多回复(16)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧