gpt4 book ai didi

c - 奇怪的C整数不等式比较结果

转载 作者:太空狗 更新时间:2023-10-29 16:34:23 25 4
gpt4 key购买 nike

#include <limits.h>
#include <stdio.h>
int main() {
long ival = 0;
printf("ival: %li, min: %i, max: %i, too big: %i, too small: %i\n",
ival, INT_MIN, INT_MAX, ival > INT_MAX, ival < INT_MIN);
}

这给出了输出:

ival: 0, min: -2147483648, max: 2147483647, too big: 0, too small: 1

这怎么可能?

(我实际上在 getargs.c 中的 CPython 2.7.3 中遇到了这个问题/错误:convertsimple。如果您查找代码,在 case 'i' 中,检查 ival < INT_MIN 始终为真对我来说。另见 test case source with further references 。)


好吧,我现在测试了几个不同的编译器。为 x86 编译的 GCC/Clang 全部返回预期值(太小:0)。为 armv7 编译时,意外输出来自 Xcode 工具链中的 Clang。


如果要复现:

这是准确的编译命令:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk test-int.c

这是 Xcode 4.3.2。

我复制了结果 a.out转到我的 iPhone 并执行它。

如果有人对由此产生的汇编代码感兴趣:

    .section    __TEXT,__text,regular,pure_instructions
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
.section __TEXT,__const_coal,coalesced
.section __TEXT,__picsymbolstub4,symbol_stubs,none,16
.section __TEXT,__StaticInit,regular,pure_instructions
.syntax unified
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 2
.code 16
.thumb_func _main
_main:
push {r7, lr}
mov r7, sp
sub sp, #20
movw r0, #65535
movt r0, #32767
movs r1, #0
movt r1, #0
str r1, [sp, #16]
str r1, [sp, #12]
ldr r1, [sp, #12]
ldr r2, [sp, #12]
cmp r2, r0
movw r0, #0
it gt
movgt r0, #1
and r0, r0, #1
ldr r2, [sp, #12]
cmn.w r2, #-2147483648
movw r2, #0
it lt
movlt r2, #1
and r2, r2, #1
mov r3, sp
str r2, [r3, #4]
str r0, [r3]
mov.w r2, #-2147483648
mvn r3, #-2147483648
movw r0, :lower16:(L_.str-(LPC0_0+4))
movt r0, :upper16:(L_.str-(LPC0_0+4))
LPC0_0:
add r0, pc
blx _printf
ldr r1, [sp, #16]
str r0, [sp, #8]
mov r0, r1
add sp, #20
pop {r7, pc}

.section __TEXT,__cstring,cstring_literals
L_.str:
.asciz "ival: %li, min: %i, max: %i, too big: %i, too small: %i\n"


.subsections_via_symbols

最佳答案

这是一个错误。在 C 标准中,太小 不能为 0 以外的任何值。这是它的工作原理:

  1. 由于 INT_MIN 是一个 int,它在“通常的算术转换”期间被转换为 long。发生这种情况是因为 long 的等级高于 int(并且都是有符号类型)。不会发生提升,因为所有操作数至少具有 int 等级。没有调用未定义或实现指定的行为。

  2. 在转换过程中,INT_MIN 的值被保留。因为是从int转换成long,所以保证long至少有int的范围>,INT_MIN 的值必须在转换期间保留。没有调用未定义或实现指定的行为。不允许进行模块化转换,这些仅适用于无符号类型。

  3. 比较的结果应该是0

对于符号扩展或其他类似的事情没有回旋余地。此外,由于对 printf 的调用是正确的,所以那里没有问题。

如果您可以在另一个系统上重现它,或者将它发送给可以重现它的其他人,您应该直接向您的工具链供应商报告错误。

重现该错误的尝试:我无法重现以下任何组合的行为,所有组合均启用和禁用优化:

  • GCC 4.0、PPC + PPC64
  • GCC 4.2、PPC + PPC64
  • 海湾合作委员会 4.3,x64
  • 海湾合作委员会 4.4,x64
  • Clang 3.0,x64

关于c - 奇怪的C整数不等式比较结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11129368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com