社区
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
怎么理解这种差别?
...全文
3965
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写文章
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++ 类型转换
例1:
int
main() {
unsigned
int
a = 0x123456f7;
unsigned
char i = (
unsigned
char)a; char *b = (char*)&a; pr
int
f("%08x,%08x\n", i, *b); system("pause"); } 程序结果输出为:000000f...
附录A 程序员工作面试的秘密
附录A 程序员工作面试的秘密
C++中
int
id[sizeof(
unsigned
long)]的语句是否正确?这个问题可能让一些初学者感到
困惑
。本文将深入探讨这个语句的含义和正确性。
这个语句定义了一个名为id的数组,数组的大小为sizeof(
unsigned
long)。由于sizeof(
unsigned
long)通常比sizeof(
int
)大,所以这个数组通常会有更多的元素。总之,
int
id[sizeof(
unsigned
long)]这个语句虽然在某些情况下是合法的,但是不太安全和可移植。另外,由于数组是在栈上分配的,而栈的大小是有限制的,这意味着如果sizeof(
unsigned
long)非常大,那么这个数组可能会导致栈溢出,从而导致程序崩溃。
mysql 查询 不等于1的,MySQL,作为1个查询,如果行不存在,则执行其他查询
对于首选项模块,我有“系统默认值”和“用户首选项”.如果没有存储个人/用户首选项,请改用系统默认值.这是我的系统偏好设置表:mysql> desc rbl;+-------------+---------------------+------+-----+---------+-------+| Field | Type | Null | Key | ...
Makefile选项CFLAGS,LDFLAGS,LIBS
我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,例: gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld 上面这句表示在编译hello.c时: -I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件...
IT培训
2,076
社区成员
4,867
社区内容
发帖
与我相关
我的任务
IT培训
华为认证、思科认证、项目管理、计算机等级考试、Linux认证、微软认证、H3C认证等IT认证相关的技术交流空间。
复制链接
扫一扫
分享
社区描述
华为认证、思科认证、项目管理、计算机等级考试、Linux认证、微软认证、H3C认证等IT认证相关的技术交流空间。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章