2017-03-20 3 views
3

두 개의 인수, 요소가 테스트되는 벡터 및 true 또는 false로 입력하는 bool 변수가있는 함수가 있습니다. 우리가 true로 입력하면 그 자리 숫자를 짝수로하는 모든 원소를 분리하여 새로운 벡터에 올리며 (같은 순서로) 그 벡터를 반환합니다. 거짓이면 반대로 홀수가됩니다. 그리고 여러분은 이미 제가 이미 사용했던 것들만 사용할 수 있습니다.왜 제대로 작동하지 않습니까? Numeric_limits

이렇게 보이는대로입니다.

std::vector<int> IzdvojiElemente(std::vector<int> v, bool flag){ 
    std::vector<int> n; 
    for(int i(0); i<v.size();i++){ 
    int suma(0); 
    int temp(v[i]); 
    if(temp<0) temp*=-1; 
    while(temp>0){ 
     suma+=temp%10; 
     temp/=10; 
    } 

    if(flag && suma%2==0) n.push_back(v[i]); 
    if(!flag && suma%2!=0) n.push_back(v[i]); 

    } 
    return n; 
} 

그리고이 작동하지 않는의 주요 기능 중 하나입니다

std::vector<int> v1 {1,std::numeric_limits<int>::min(),2, std::numeric_limits<int>::max(),5}; 
std::vector<int> v2; 

v2 = IzdvojiElemente(v1, false); 

for(int i=0; i < v2.size(); i++) 
    std::cout << v2[i] << " "; 

이것은 내가 (출력으로) 가져했는데 무엇 :

1 -2147483648 5 

이것이 내가 가진 것입니다 :

1 5 

som 숫자 제한을 무시하거나 잘못된 벡터로 정렬하지 않습니다. 왜 그런지 모르겠습니다. 다른 경우에는 정상적으로 작동합니다. 어쩌면 오버플로가 될 수도 있지만 어디서 볼 수는 없습니다.

답변

4

예, 오버플로입니다. 부호있는 정수 (주류 플랫폼의 공통 표현)의 2의 보수 표현에서 표현 가능한 범위는 대칭이 아닙니다. 가장 낮은 표현 가능한 수는 -2147483648이고 가장 높은 표현 가능한 수는 2147483647입니다.

-2147483648 * -1은 부호가있는 정수 오버플로이고 정의되지 않은 동작입니다. 프로그램이 잘못되어 아무 것도 일어나지 않을 수 있습니다.

내부 표현에 관계없이 std::numeric_limits<int>::min()을 올바르게 처리해야하는 경우 음수를 다르게 처리해야합니다 (예 : 음수로 계산 한 다음 계산 된 합계를 부호 반전하는 등).

+0

"표현 가능"이라는 단어 (l 대신 k)에서 실수했습니다. –