标题:char -128的整型提升为什么和一般的不一样?
只看楼主
coter123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2023-2-18
结帖率:0
已结贴  问题点数:20 回复次数:4 
char -128的整型提升为什么和一般的不一样?
char a= -128;
printf("%u",a);

-128 补码:10000001
整型提升后应是:11111111 11111111 11111111 10000001  =4294967169
系统算出来却是4294967168

把char类型换成short,结果也是这个
为什么呢?麻烦大佬解释下
搜索更多相关主题的帖子: short 整型 结果 char 类型 
2023-02-18 12:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:7 
首先 char 是否 具符号 属于 实现定义。一般而言,vc默认char具符号,gcc默认char无符号。

从你的现象来看,你用的是 char具符号 的编译器。
要尽量保证 负值的char 在进行类型提升后 它的值依然保持不变,那么 10000000(8bits的具符号类型,值-128) 变为 11111111 11111111 11111111 10000000(32bits的具符号类型,值-128) 有什么不对?
你的问题在于,把 -128(signed int)强制转化成 unsigned int 类型,那么 11111111 11111111 11111111 10000000 当成 无符号整型看待,它就是 4294967168,也没有什么不对

总之,你应该用
char a= -128;
printf("%d",a);
而不是 %u
2023-02-18 16:27
coter123
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2023-2-18
得分:0 
回复 2楼 rjsp
好的,谢谢!
2023-02-19 08:46
laike23
Rank: 1
等 级:新手上路
帖 子:1
专家分:7
注 册:2023-2-20
得分:7 
2023-02-20 15:45
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:7 
以下是引用rjsp在2023-2-18 16:27:05的发言:

首先 char 是否 具符号 属于 实现定义。一般而言,vc默认char具符号,gcc默认char无符号。

从你的现象来看,你用的是 char具符号 的编译器。
要尽量保证 负值的char 在进行类型提升后 它的值依然保持不变,那么 10000000(8bits的具符号类型,值-128) 变为 11111111 11111111 11111111 10000000(32bits的具符号类型,值-128) 有什么不对?
你的问题在于,把 -128(signed int)强制转化成 unsigned int 类型,那么 11111111 11111111 11111111 10000000 当成 无符号整型看待,它就是 4294967168,也没有什么不对

总之,你应该用
char a= -128;
printf("%d",a);
而不是 %u


楼主主要的问题在于把-128的二进制形式写错了一位。
收到的鲜花
  • rjsp2023-02-21 10:44 送鲜花  10朵   附言:确实,我粗心了

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2023-02-21 09:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511330-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.756025 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved