Geek-Side

Resource > 3_4

/**
 * 2の補数表現では、最上位のビットを負数の表現に使用する。
 * 01111111  -> 127
 * 01111110  -> 126
 * .
 * .
 * .
 * 10000010  -> -126
 * 10000001  -> -127
 * 10000000  -> -128
 * 
 * 1の補数は、ビットを反転させたもの。
 * 2の補数は1の補数+1。
 *
 * 最大の負数から正数を得る時に桁あふれしてしまうため、扱えない。
 **/

#include <CUnit/CUnit.h>
#include <CUnit/Console.h>

#include <stdio.h>
#include <limits.h>

#define MAX_SIZE 100

void reverse(char s[]) {
  int c, i, j;
  for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
  }
}

void itoa(int n ,char s[]) {
  int i, sign;
  i = 0;
  if ((sign = n) < 0) {
    s[i++] = - (n % -10)  + '0';
    n /= -10;
  }

  do {
    s[i++] = n % 10 + '0';
  } while ((n /= 10) > 0);

  if (sign < 0) {
    s[i++] = '-';
  }
  s[i] = '0';
  reverse(s);
}

void testnormal(void) {
  char result[MAX_SIZE] = "123456789";
  char before[MAX_SIZE] = "";
  itoa(123456789, before);
  CU_ASSERT_STRING_EQUAL(before, result);
}

void testMaxNormal(void) {
  char before[MAX_SIZE] = "";
  char result[MAX_SIZE] = "";
  sprintf(result, "%d", INT_MAX);
  itoa(INT_MAX, before);
  CU_ASSERT_STRING_EQUAL(before, result);
}

void testnegative(void) {
  char result[MAX_SIZE] = "-123456789";
  char before[MAX_SIZE] = "";
  itoa(-123456789, before);
  CU_ASSERT_STRING_EQUAL(before, result);
}

void testMaxNegative(void) {
  char before[MAX_SIZE] = "";
  char result[MAX_SIZE] = "";
  sprintf(result, "%d", INT_MIN);
  itoa(INT_MIN, before);
  CU_ASSERT_STRING_EQUAL(before, result);
}

int main(void) {
  CU_pSuite testSuite;
  CU_initialize_registry();
  testSuite = CU_add_suite("3_4TestSuite", NULL, NULL);
  CU_add_test(testSuite, "Normal Test", testnormal);
  CU_add_test(testSuite, "Max Normal Test", testMaxNormal);
  CU_add_test(testSuite, "Negative Test", testnegative);
  CU_add_test(testSuite, "Max Negative Test", testMaxNegative);
  CU_console_run_tests();
  CU_cleanup_registry();
  
  return 0;
}