请解惑.unsigned int + int

Freeze_Z 2013-07-08 01:55:43
unsigned int x = -1;
int y = 11;
int z = 10;
unsigned int uz = 10;

if(x+y == 10)
if(x+y == z)
if(x+y == uz)

x+y的计算是否引起溢出?
if语句是否能进入?

1.原理?
2.是否有编译器的差异. gcc, g++, vc?
...全文
382 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bedynamic 2013-07-08
  • 打赏
  • 举报
回复
学习一下。。。。。
艾薇儿More 2013-07-08
  • 打赏
  • 举报
回复
请参考计算机组成原理原码、补码、反码和移码部分,谢谢。
AnYidan 2013-07-08
  • 打赏
  • 举报
回复
unsigned int x = -1; 依赖具体实现
Ericz 2013-07-08
  • 打赏
  • 举报
回复
那么题目可以转换为对 (unsigned int)-1 + (unsigned int)11 结果是否确定是10. 溢出后的确定是10?或者有编译器行为? 发生了溢出,结果确定是10,没有编译器行为,这是C语言标准行为。 编译器不做加法,编译器只是把加法代码转换成机器代码,最后由硬件(加法器)实现加法。
引用 5 楼 Freeze_Z 的回复:
这题的考点大概在unsigned int + int时 int 退化到unsigned int. 那么题目可以转换为对 (unsigned int)-1 + (unsigned int)11 结果是否确定是10. 溢出后的确定是10?或者有编译器行为? 或者是请帮忙解释下编译器是怎么做加法的. 11111111 00001011 ---------- 100001010 这样?
Freeze_Z 2013-07-08
  • 打赏
  • 举报
回复
上述中的8位换成32位理解.
Freeze_Z 2013-07-08
  • 打赏
  • 举报
回复
这题的考点大概在unsigned int + int时 int 退化到unsigned int. 那么题目可以转换为对 (unsigned int)-1 + (unsigned int)11 结果是否确定是10. 溢出后的确定是10?或者有编译器行为? 或者是请帮忙解释下编译器是怎么做加法的. 11111111 00001011 ---------- 100001010 这样?
honey_fansy 2013-07-08
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
//有符号整形a和b,如何判断a+b是否溢出
#include <stdio.h>
int ifo_add(int a,int b) {
    __asm {
        mov eax,a
        add eax,b
        jo  overflowed
        xor eax,eax
        jmp no_overflowed
overflowed:
        mov eax,1
no_overflowed:
    }
}
int main() {
    int a,b;

    a=          1;b= 2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
    a=         -1;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
    a= 2147483647;b= 1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
    a=-2147483647;b=-1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
    a=-2147483647;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
}
//          1+( 2) 0
//         -1+(-2) 0
// 2147483647+( 1) 1
//-2147483647+(-1) 0
//-2147483647+(-2) 1
好久没见嵌入汇编的代码了,不过函数写错了,楼主问的是unsigned int与int相加,你的是int与int相加,改改再测试就行了
赵4老师 2013-07-08
  • 打赏
  • 举报
回复
//有符号整形a和b,如何判断a+b是否溢出
#include <stdio.h>
int ifo_add(int a,int b) {
    __asm {
        mov eax,a
        add eax,b
        jo  overflowed
        xor eax,eax
        jmp no_overflowed
overflowed:
        mov eax,1
no_overflowed:
    }
}
int main() {
    int a,b;

    a=          1;b= 2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
    a=         -1;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
    a= 2147483647;b= 1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
    a=-2147483647;b=-1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
    a=-2147483647;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
}
//          1+( 2) 0
//         -1+(-2) 0
// 2147483647+( 1) 1
//-2147483647+(-1) 0
//-2147483647+(-2) 1
赵4老师 2013-07-08
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
  • 打赏
  • 举报
回复
c++ primer里说:C++ 中,把负值赋给 unsigned 对象是完全合法的,其结果是该负数对该类型的取值个数求模后的值。当将超过取值范围的值赋给 signed 类型时,由编译器决定实际赋的值。在实际操作中,很多的编译器处理 signed 类型的方式和 unsigned 类型类似。也就是说,赋值时是取该值对该类型取值数目求模后的值。然而我们不能保证编译器都会这样处理 signed 类型。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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