странный результат сравнения целочисленного неравенства C

#include 
#include 
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

Как это возможно?

(На самом деле я столкнулся с этой проблемой/ошибкой в ​​CPython 2.7.3 вgetargs.c:convertsimple. Если вы посмотрите код, в case 'i'есть проверка ival < INT_MIN, которая всегда была верной для меня. См. также источник тестового примера с дополнительными ссылками .)


Ну, я протестировал несколько разных компиляторов. GCC/Clang, скомпилированные для x86, возвращают ожидаемое значение (too small :0 ). Неожиданный вывод — это Clang в цепочке инструментов Xcode при компиляции для armv7.


Если вы хотите воспроизвести:

Это точная команда компиляции:/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
15
задан Albert 21 June 2012 в 02:06
поделиться