| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 713 人关注过本帖
标题: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
等 级:版主
威 望:528
帖 子:9032
专家分:54061
注 册: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: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册: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
快速回复:char -128的整型提升为什么和一般的不一样?
数据加载中...
 
   



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

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