C++如何识别正数负数?

哇咔咔咔咔哇 2009-09-27 07:49:52

int a=0xffffffff;
unsigned b=a;
int c=-1;




结果a=c=-1;b为正数
a b c在内存中的数据完全相同,请问程序是怎么识别它们是正数还是负数的?截图如下:




...全文
1497 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ians_Huyu 2012-09-11
  • 打赏
  • 举报
回复
还没完,如果是int型的常量,编译器怎么知道正负并且将负的转换为负数的补码呢??
哇咔咔咔咔哇 2009-09-27
  • 打赏
  • 举报
回复
再次感谢各位热心助人的编程达人们!阿门!
哇咔咔咔咔哇 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hpsmouse 的回复:]
都说了,程序不知道……
你不声明,程序甚至不知道变量占用的空间大小。
你声明了变量类型,在编译的时候,编译器是知道的,然后编译器决定做什么操作……
[/Quote]


多看了点汇编代码,结合你的回答,搞清楚是什么回事了。哎,没事头发昏就干起蠢事来了!
真心的说声,谢谢您啦!!!!!
loveour 2009-09-27
  • 打赏
  • 举报
回复
就是那么一块内存,里面有那么一些数据,怎么解释,就是编译器做的事情了。定义类型就是做这样的事情,内存布局虽然一样,但是类型声明为不一样了;操作代码那里没有体现出类型来,因为那个操作无关类型,但是本身程序有定义的部分呀,有符号表
哇咔咔咔咔哇 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hpsmouse 的回复:]
都说了,程序不知道……
你不声明,程序甚至不知道变量占用的空间大小。
你声明了变量类型,在编译的时候,编译器是知道的,然后编译器决定做什么操作……
[/Quote]

非常感谢你的指点,可我还有点小疑问,╮(╯▽╰)╭
2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 haart 的回复:]
若不看源码,是断然无法知道[ebp-0Ch],[ebp-10h]处的数据类型的,可是程序却可以分别前一处地址的是int型,后一处地址的是float型,这不是很奇怪么?
[/Quote]
什么叫做“分别”?
变量的数据类型表现在程序对其实施的操作中……而这个操作是由编译器决定的。
再说了,mov 和 push 需要知道类型吗?
menghai1226 2009-09-27
  • 打赏
  • 举报
回复
一同学习啦
哇咔咔咔咔哇 2009-09-27
  • 打赏
  • 举报
回复
一个C++片段的反汇编代码如下


22: int c=-1;
004015E5 C7 45 F4 FF FF FF FF mov dword ptr [ebp-0Ch],0FFFFFFFFh
23:
24: float d=1.558;
004015EC C7 45 F0 8B 6C C7 3F mov dword ptr [ebp-10h],3FC76C8Bh
25:
26:
27: cout<<a<<endl<<b<<d<<endl;
004015F3 68 C8 10 40 00 push offset @ILT+195(std::endl) (004010c8)



若不看源码,是断然无法知道[ebp-0Ch],[ebp-10h]处的数据类型的,可是程序却可以分别前一处地址的是int型,后一处地址的是float型,这不是很奇怪么?
2009-09-27
  • 打赏
  • 举报
回复
都说了,程序不知道……
你不声明,程序甚至不知道变量占用的空间大小。
你声明了变量类型,在编译的时候,编译器是知道的,然后编译器决定做什么操作……
哇咔咔咔咔哇 2009-09-27
  • 打赏
  • 举报
回复
VC里面int 与float 的size都是4,变量所在内存地址储存的全部信息都是数据大小,那“它们的数据类型”的信息储存在什么地方呢?
不然程序怎么知道哪个地址的数据是 int 型的,哪个地址的数据是unsigned型的,哪个地址的数据是float型的?
szqh97 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hpsmouse 的回复:]
程序本身不识别,是你声明变量时告诉它是有符号还是无符号的。
[/Quote]对,跟声明有关
starcat 2009-09-27
  • 打赏
  • 举报
回复
up

你不声明,程序才不知道同一块内存地址中的数值是int还是float呢
2009-09-27
  • 打赏
  • 举报
回复
程序本身不识别,是你声明变量时告诉它是有符号还是无符号的。
哇咔咔咔咔哇 2009-09-27
  • 打赏
  • 举报
回复
图片的右半部分被挡住了,复制地址到浏览器中打开就能看见完整截图了!

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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