野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 393668|回复: 1201

【每日一题】-1和1的数值比较

  [复制链接]
发表于 2014-2-19 00:00:19 | 显示全部楼层 |阅读模式
分析下面的代码,求运行结果
  1. int main()
  2. {
  3.     if(-1L > 1UL)
  4.         printf("1\n");
  5.     else
  6.         printf("0\n");
  7.     return 0;
  8. }
复制代码
请回答问题后再看答案哦,否则 每日一题 就没有意义了。
答错的,讲一下 为什么 会答错 呗!


常量后面接L表示long型存储,U表示unsigned,F表示float

此题的关键是 -1L > 1UL

一个是long型,一个是unsigned long型,无符号和有符号的比较,那么编译器会把有符号的转换为无符号。
-1L = 0xFFFFFFFF
1UL = 0x00000001

因为 0xFFFFFFFF > 0x00000001 ,所以 -1L > 1UL

运行结果为:打印1

回复

使用道具 举报

发表于 2014-2-19 02:24:38 | 显示全部楼层
1
-1L应该是0xffff,1UL是0x0001,所以-1大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 02:26:03 | 显示全部楼层
箫剑酒仙 发表于 2014-2-19 02:24
1
-1L应该是0xffff,1UL是0x0001,所以-1大

厉害,不过long型是32位的
回复 支持 反对

使用道具 举报

发表于 2014-2-19 09:22:32 | 显示全部楼层
输出为1吧,两个不同类型的数据比较,应该会转换成无符号类型。。
回复 支持 3 反对 0

使用道具 举报

发表于 2014-2-19 10:25:46 | 显示全部楼层
本帖最后由 飞鸿印雪 于 2014-2-20 09:31 编辑

题中的整型常量-1L和1UL 是存放在函数代码段(.text)?  还是像字符串常量一样存放在常量段(.rodata)?
还有如果只写-1和1是不是默认就是long型的啊?有没有类似看变量大小的sizeof来看-1L的大小的啊?
回复 支持 反对

使用道具 举报

发表于 2014-2-19 10:46:58 | 显示全部楼层
走过路过,不能错过
回复 支持 反对

使用道具 举报

发表于 2014-2-19 11:19:50 | 显示全部楼层
计算机只计算二进制码,不会算正与负,所以是-1大
回复 支持 反对

使用道具 举报

发表于 2014-2-19 11:33:04 | 显示全部楼层
答案是1  , 大概知道负数的保存形式应该是补码
回复 支持 反对

使用道具 举报

发表于 2014-2-19 15:18:35 | 显示全部楼层
真不知道是什么意思。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 15:45:18 | 显示全部楼层
flr 发表于 2014-2-19 11:19
计算机只计算二进制码,不会算正与负,所以是-1大

虽然答对结果,但解释不对
回复 支持 反对

使用道具 举报

发表于 2014-2-19 17:21:37 | 显示全部楼层
强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-2-19 17:57:44 | 显示全部楼层
学习知识了强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-2-19 20:07:35 | 显示全部楼层
-1L=0XFF FF FF FF
1UL=0X00 00 00 01
结果:1
回复 支持 反对

使用道具 举报

发表于 2014-2-19 21:56:26 | 显示全部楼层
山外メ雲ジ 发表于 2014-2-19 02:26
厉害,不过long型是32位的

啊,对奥,,,
回复 支持 0 反对 1

使用道具 举报

发表于 2014-2-20 10:11:22 | 显示全部楼层
负数在计算机是以补吗的形式存在的,应该是-1大吧,话说在-1后面加L是便是它的类型是长整型吗?
回复 支持 反对

使用道具 举报

发表于 2014-2-20 10:38:30 | 显示全部楼层
应该是-1比较大吧
回复 支持 反对

使用道具 举报

发表于 2014-2-20 10:45:05 | 显示全部楼层
进来学习一下
回复 支持 反对

使用道具 举报

发表于 2014-2-21 21:53:01 | 显示全部楼层
计算机里存储的是二进制的补码,-1的补码是0xffff,1的补码是本身所以结果打出1换行
回复 支持 反对

使用道具 举报

发表于 2014-2-23 12:49:05 | 显示全部楼层
这个真心不懂。。。学习
回复 支持 反对

使用道具 举报

发表于 2014-2-23 12:49:33 | 显示全部楼层
这个真心不懂。。。学习
回复 支持 反对

使用道具 举报

发表于 2014-2-23 13:02:52 | 显示全部楼层
相信第一感觉,果断是1,不会又被坑了吧。
回复 支持 反对

使用道具 举报

发表于 2014-2-23 13:09:16 | 显示全部楼层
山外メ雲ジ 发表于 2014-2-19 15:45
虽然答对结果,但解释不对

C语言中,负数是用补码表示的(反码加1),正数直接用原码表示.
-1表示为:00000000 00000001 的反码 11111111 11111110+1 即 11111111 11111111 转换为十进制数为65535
还有最高位为符号位不必考虑。,So easy!
回复 支持 4 反对 0

使用道具 举报

发表于 2014-2-23 13:56:48 | 显示全部楼层
看了评论知道是1
但是我想问  如果是 声明了两个变量  也是就   
long int i=-1;
unsigned long int u=1;
再做比较也是这样么?
那这样的话  有符号和无符号的变量作比较就容易出错了啊。。。还好至今这么做过
回复 支持 反对

使用道具 举报

发表于 2014-2-24 11:03:41 | 显示全部楼层
答案应该输出为1
回复 支持 反对

使用道具 举报

发表于 2014-2-24 11:17:50 | 显示全部楼层
输出结果应该是1
回复 支持 反对

使用道具 举报

发表于 2014-2-25 09:59:04 | 显示全部楼层
走过路过,不能错过
回复 支持 反对

使用道具 举报

发表于 2014-2-27 14:49:58 | 显示全部楼层
-1是有符号长整型,1是无符号长整型!
回复 支持 反对

使用道具 举报

发表于 2014-3-1 17:32:54 | 显示全部楼层
结果应该是1

回复 支持 反对

使用道具 举报

发表于 2014-3-2 09:51:09 | 显示全部楼层
学习学习……
回复 支持 反对

使用道具 举报

发表于 2014-3-2 14:34:57 | 显示全部楼层
-1L中的L是什么意思
回复 支持 反对

使用道具 举报

发表于 2014-3-2 16:23:43 | 显示全部楼层
学习中~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2014-3-2 22:42:42 | 显示全部楼层
真心不会,看答案
回复 支持 反对

使用道具 举报

发表于 2014-3-3 09:33:53 | 显示全部楼层
-1L=0Xffff ffff 1UL=0X0000 0001
结果:1
回复 支持 反对

使用道具 举报

发表于 2014-3-4 10:57:22 | 显示全部楼层
-1的补码为0xffff,1的补码是0x0001
所以输出是1换行
回复 支持 反对

使用道具 举报

发表于 2014-3-5 19:27:08 | 显示全部楼层
答案应该是1吧
回复 支持 反对

使用道具 举报

发表于 2014-3-5 21:07:10 | 显示全部楼层
L 和 UL 是什么意思?
回复 支持 反对

使用道具 举报

发表于 2014-3-6 13:20:37 | 显示全部楼层
1吧,L和UL的区别开来就知道了
回复 支持 反对

使用道具 举报

发表于 2014-3-6 14:10:38 | 显示全部楼层
-1L > 1UL 是什么意思啊
回复 支持 反对

使用道具 举报

发表于 2014-3-8 13:03:27 | 显示全部楼层
1  -1是0xFFFF强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-3-8 18:54:25 | 显示全部楼层
打印出数值 0
回复 支持 反对

使用道具 举报

发表于 2014-3-10 13:27:05 | 显示全部楼层
这个还真不知道,不知UL和L是什么
回复 支持 反对

使用道具 举报

发表于 2014-3-10 13:33:35 | 显示全部楼层
答案是 1吧
回复 支持 反对

使用道具 举报

发表于 2014-3-11 09:59:57 | 显示全部楼层
输出为1 -1L   1111  1111  1111 1111 1111 1111 1111 1111
          1UL 0000  0000  0000 0000 0000 0000 0000 0001
回复 支持 反对

使用道具 举报

发表于 2014-3-12 13:38:35 | 显示全部楼层
在比较操作中,会将相同长度的两个数的有符号的长整数转换为无符号的长整数,所以有-1L>1UL
回复 支持 反对

使用道具 举报

发表于 2014-3-14 09:13:04 | 显示全部楼层
笑坏我的肚子了



0


回复 支持 反对

使用道具 举报

发表于 2014-3-15 23:03:12 | 显示全部楼层
强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-3-16 09:51:04 | 显示全部楼层
不明白,看答案
回复 支持 反对

使用道具 举报

发表于 2014-3-16 22:05:41 | 显示全部楼层
强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-3-17 15:02:46 | 显示全部楼层
走过路过,不能错过
回复 支持 反对

使用道具 举报

发表于 2014-3-18 01:22:47 | 显示全部楼层
强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 22:45 , Processed in 0.061653 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表