Objective c 目标C整数比较误差

Objective c 目标C整数比较误差,objective-c,lldb,comparison-operators,Objective C,Lldb,Comparison Operators,有人能用Xcode/Objective C向我解释这些结果吗?当然,在任何情况下,-2都不应该大于31 (lldb) p dayOfMonth (int) $37 = -2 (lldb) p (dayOfMonth > 31) (bool) $38 = true (lldb) p (dayOfMonth > (int)31) (bool) $39 = true (lldb) p (dayOfMonth > (float)31) (bool) $40 = false 我从来

有人能用Xcode/Objective C向我解释这些结果吗?当然,在任何情况下,-2都不应该大于31

(lldb) p dayOfMonth
(int) $37 = -2
(lldb) p (dayOfMonth > 31)
(bool) $38 = true
(lldb) p (dayOfMonth > (int)31)
(bool) $39 = true 
(lldb) p (dayOfMonth > (float)31) 
(bool) $40 = false
我从来没有见过像这样直截了当的错误答案,也无法想象它怎么会被误解。正如调试器所说,dayOfMonth只是一个int

编辑添加:以下是失败的代码(删除了一些不相关的行):

NSRange monthdays=[self.calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:self.displayedDate];
int dayOfMonth=i+1-shift;//负天数在上个月底;超过月长的天数在下一个月
如果(dayOfMonth<1)cellView.dayLabel=prevMonthDays.length+dayOfMonth;
如果(dayOfMonth>monthdays.length)cellView.dayLabel=dayOfMonth-monthdays.length;

第二个
if
在dayOfMonth为负值时计算为true。

已确认-这是lldb IR解释器中的错误

以下是修复该问题的修补程序的链接:

请注意,新的测试用例正是您的问题:

+        self.expect("expression (int)-2",
+            startstr = "(int) $4 = -2")
+
+        self.expect("expression $4 > (int)31",
+            startstr = "(bool) $5 = false")
因此,这将使你在未来的工作

就您的代码而言,您确实有一个bug。这种情况:

if (dayOfMonth > monthdays.length)
没有做你想做的事
dayOfMonth
已签名,
monthdays.length
未签名。这意味着
dayOfMonth
将升级为无符号类型,并且比较结果会变差。你需要一个演员在那里清理东西:

if (dayOfMonth > (NSInteger)monthdays.length)

可能是一些奇怪的二进制东西。由于某种原因,东西正在转换为无符号类型。我看不出为什么要快速扫描文档。我猜这是一只虫子。我在这里得到了相同的结果,但它在GDB中运行良好;你能用它来代替吗?它不仅仅在调试器中——我编译的代码也在犯同样的错误。你能用你的日志结果发布你的实际代码吗?请显示你的代码!无问题-编辑答案,解释您的程序的问题。Gah。当然,C允许有符号int被静默地“提升”为无符号int是错误的。我的意思是,很明显,这个表达式只测试为真,因为C决定改变我身上的一个数字。但是好吧。谢谢你的回答!但我不应该至少得到一个关于无效比较的警告吗?确认,我看到苹果默认的GCC警告标志与否相比,天哪。而Analyze也无法识别。
if (dayOfMonth > (NSInteger)monthdays.length)