社区
IT培训
帖子详情
int i=-20;unsigned int j=10; i+j的困惑
RogerChange
2015-11-16 03:47:14
int i=-20;
unsigned int j=10;
在vc中编译:
若采用printf("%d", i+j);结果是:-10
若采用printf("%u", i+j);结果是:4294967286
若采用cout输出,则结果是:4294967286
怎么理解这种差别?
...全文
4008
9
打赏
收藏
int i=-20;unsigned int j=10; i+j的困惑
int i=-20; unsigned int j=10; 在vc中编译: 若采用printf("%d", i+j);结果是:-10 若采用printf("%u", i+j);结果是:4294967286 若采用cout输出,则结果是:4294967286 怎么理解这种差别?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
瑞莱克斯
2018-03-31
打赏
举报
回复
楼上大哥 分析的确实很细致 但是有点疑问 无符号输出时 是直接输出补码吗 那“%d”输出为什么是将计算所得的补码转换为原码输出
LiuBo_01
2018-03-21
打赏
举报
回复
整形数据在内存中存放二进制补码。所以数据的运算可以理解为是补码运算。 -20 的原码为: 10000000 00000000 00000000 00010100 原码 11111111 11111111 11111111 111 01011 反码 11111111 11111111 11111111 111 01100 补码 10 的补码为(正数的补码原码反码都相同): 00000000 00000000 00000000 00001010 i=-20 unsigned j=10 i+j 11111111 11111111 11111111 111 01100 + 00000000 00000000 00000000 00001010 ------------------------------------------------------------------------ = 11111111 11111111 11111111 11110110 所以i+j 的补码为: 11111111 11111111 11111111 11110110 虽然计算机存放的是补码,但输出的是原码对应的数值,最高位符号为为1,表示运算结果为负数,将i+j的补码转化为原码:(-1取反) 得: 11111111 11111111 11111111 11110110 - 1 --------------------------------------------------------------------------- 11111111 11111111 11111111 11110101 取反后为: 10000000 00000000 00000000 00001010 对应二进制数为-10,所以运算结果为-10。 至于以%u (无符号输出) 可以这样理解:无符号数是没有符号位的,都是正数。 i+j 的补码为: 11111111 11111111 11111111 11110110 所以以符号数形式输出时,输出的就是对应二进制数的大小。 即: 11111111 11111111 11111111 11110110的数值大小。 如果把这个二进制数当全是1 计算的话数值大小为 2^32-1 ,当我们当全1计算的话多加了9,所以其运算结果为2^32-1-9 = 4294967286 以上使自己的简单理解,希望对你有帮助,如有错误,欢迎指正交流。
qq_31195831
2016-08-26
打赏
举报
回复
666666
xman01111
2016-05-25
打赏
举报
回复
低级的类型 当与高级类型 进行运算时 会默认将低级类型转化为高级 像你问的 int 和unsinge 会将整形转化为无符号整形 无符号整形没有小数之说 当运算结果小于0便会出现溢出现象 0的后边不是-1而是4294967296 所以就出现了 -10是4294967286的结果
secondtop
2016-05-11
打赏
举报
回复
计算机计算是通过二进制计算,因为两种类型在内存上储存的方式不同,导致结果差异很大。
qq_27985735
2016-05-09
打赏
举报
回复
要强制转换类型 基础的问题 推荐去看高淇Java300集视频教程
kvls
2015-12-03
打赏
举报
回复
隐式类型转换 int转换为了unsigned int
_TheOne_
2015-12-02
打赏
举报
回复
像这种情况,你需要强制类型转换
_TheOne_
2015-12-02
打赏
举报
回复
像这种情况,你需要强制类型转换
《谭浩强:C语言程序设计(第三版)》质疑.doc
《谭浩强:C语言程序设计(第三版)》是一本广受欢迎的C语言教材,但它在某些方面存在一些误导性的描述,可能对初学者造成
困惑
。以下是对这些疑点的详细解析: 1. 整型常量的表示:书中提到“常量无
unsigned
型”,...
C++ 类型转换
unsigned
char i = (
unsigned
char)a; char *b = (char*)&a; pr
int
f("%08x,%08x\n", i, *b); system("pause"); } 程序结果输出为:000000f...
C语言学习笔记 : 无符号类型
unsigned
与
unsigned
int
是否一样
C语言学习笔记 : 无符号类型
unsigned
与
unsigned
int
是否一样
C++中
int
id[sizeof(
unsigned
long)]的语句是否正确?这个问题可能让一些初学者感到
困惑
。本文将深入探讨这个语句的含义和正确性。
由于sizeof(
unsigned
long)通常比sizeof(
int
)大,所以这个数组通常会有更多的元素。总之,
int
id[sizeof(
unsigned
long)]这个语句虽然在某些情况下是合法的,但是不太安全和可移植。另外,由于数组是在栈上分配的,...
附录A 程序员工作面试的秘密
int
main( void ){
int
len, i, j, m; char s[6]={0}; char str[] = "12345"; len = strlen( str ); Recursion( str, s, len, 0, 0 ); return EXIT_SUCCESS; }
int
Recursion( char *str, char *s,
int
len,
int
m...
IT培训
2,075
社区成员
4,863
社区内容
发帖
与我相关
我的任务
IT培训
华为认证、思科认证、项目管理、计算机等级考试、Linux认证、微软认证、H3C认证等IT认证相关的技术交流空间。
复制链接
扫一扫
分享
社区描述
华为认证、思科认证、项目管理、计算机等级考试、Linux认证、微软认证、H3C认证等IT认证相关的技术交流空间。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章