#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);
}
(I 실제로 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
이 엑스 코드 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
캐스팅 버크일지도 몰라? INT_MIN을 길게 캐스팅하고 해당 기호를 올바르게 처리하지 못하고 있습니까? 혹은 그 반대로도? O.o – TheZ
@Albert 흥미 롭습니다.'ival : 0, min : -2147483648, max : 2147483647, too big : 0, too small : 0' –
printf에 % i 형식이 없다고 생각합니다. % d을 원할 수도 있습니다. 그리고 printf와 같은 varargs 함수에 대한 인수를 명시 적으로 int로 캐스팅하는 것이 좋은 습관입니다. (이 경우에는 (a> b)의 값이 int 형으로되어 있기 때문에 불필요합니다.) – wildplasser