Go: package main

import (
	"bufio"
	"fmt"
	"math/big"
	"os"
	"strconv"
)

var scanner = bufio.NewScanner(os.Stdin)

func nextString() string {
	scanner.Scan()
	return scanner.Text()
}

func nextInt() int {
	n, err := strconv.Atoi(nextString())
	if err != nil {
		fmt.Printf("strconv.Atoi failed: %v\n", err)
	}
	return n
}

func main() {
	scanner.Split(bufio.ScanWords)

	const maxCapacity = 512 * 1024
	buf := make([]byte, maxCapacity)
	scanner.Buffer(buf, maxCapacity)

	n := nextInt()
	maxint, _ := new(big.Int).SetString("100000000000000000000000000000000000000000000000000000000000000000000000000000000", 10)

	for i := 0; i < n; i++ {
		aStr := nextString()
		bStr := nextString()

		a, _ := new(big.Int).SetString(aStr, 10)
		b, _ := new(big.Int).SetString(bStr, 10)
		c := big.NewInt(0).Add(a, b)

		if c.Cmp(maxint) < 0 {
			fmt.Println(c)
		} else {
			fmt.Println("overflow")
		}
	}
}

C++: 

import java.util.Scanner;

public class Main {

	int SIZE = 80;
	int[] ans;

	void run() {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();

		for (int l = 0; l < n; l++) {
			// 80ケタの数字は扱えないので文字列に
			char[] a = sc.next().toCharArray();
			char[] b = sc.next().toCharArray();

			// 入力が80ケタを超える
			if (a.length > SIZE || b.length > SIZE) {
				System.out.println("overflow");
				continue;
			}

			// 文字列⇒配列に
			int[] x = new int[a.length];
			int[] y = new int[b.length];
			for (int i = 0; i < a.length; i++) {
				x[i] = a[i] - '0';
			}
			for (int i = 0; i < b.length; i++) {
				y[i] = b[i] - '0';
			}

			// 大きい桁数+1だけ答えの配列をとる
			if (x.length >= y.length) {
				ans = new int[x.length + 1];
			} else {
				ans = new int[y.length + 1];
			}

			int i = x.length - 1;
			int j = y.length - 1;
			int k = ans.length - 1;
			int count = 0;
			boolean flag = false;

			// 同じ桁数の計算
			while (i >= 0 && j >= 0) {
				count++;
				ans[k] += (x[i] + y[j]);
				// 繰り上がり処理
				if (ans[k] >= 10) {
					if (count < SIZE) {
						ans[k - 1] = 1;
						ans[k] -= 10;
					} else {
						flag = true;
					}
				}
				i--;
				j--;
				k--;
			}

			if (i > j) {
				while (i >= 0) {
					count++;
					ans[k] += x[i];
					// 繰り上がり処理
					if (ans[k] >= 10) {
						if (count < SIZE) {
							ans[k - 1] = 1;
							ans[k] -= 10;
						} else {
							flag = true;
						}
					}
					k--;
					i--;
				}
			} else {
				while (j >= 0) {
					count++;
					ans[k] += y[j];
					// 繰り上がり処理
					if (ans[k] >= 10) {
						if (count < SIZE) {
							ans[k - 1] = 1;
							ans[k] -= 10;
						} else {
							flag = true;
						}
					}
					k--;
					j--;
				}
			}

			if (flag) {
				System.out.println("overflow");
				continue;
			}

			for (int m = 0; m < ans.length; m++) {
				if (m == 0 && ans[m] == 0) {
					continue;
				}
				System.out.print(ans[m]);
			}
			System.out.println();
		}

		sc.close();
	}

	// void run1() {
	// Scanner sc = new Scanner(System.in);
	// int n = sc.nextInt();
	//
	// for (int k = 0; k < n; k++) {
	// // char[] a = new char[SIZE];
	// // char[] b = new char[SIZE];
	//
	// int[] x = new int[SIZE];
	// int[] y = new int[SIZE];
	// int[] ans = new int[SIZE];
	//
	// char[] a = sc.next().toCharArray();
	// char[] b = sc.next().toCharArray();
	//
	// if (a.length > 80 || b.length > 80) {
	// System.out.println("overflow");
	// continue;
	// }
	//
	// for (int i = 0; i < a.length; i++) {
	// x[i] = a[i] - '0';
	// }
	//
	// for (int i = 0; i < b.length; i++) {
	// y[i] = b[i] - '0';
	// }
	//
	// int i = a.length - 1;
	// int j = b.length - 1;
	// int l = 0;
	// boolean flag = true;
	//
	// while (i >= 0 || j >= 0) {
	// if (j < 0) {
	// while (i >= 0) {
	// ans[l] += x[i];
	// if (ans[l] >= 10) {
	// ans[l] -= 10;
	// if (l + 1 >= 80) {
	// flag = false;
	// break;
	// }
	// ans[l + 1] = 1;
	// }
	// l++;
	// i--;
	// }
	// break;
	// }
	//
	// if (i < 0) {
	// while (j >= 0) {
	// ans[l] += y[j];
	// if (ans[l] >= 10) {
	// ans[l] -= 10;
	// if (l + 1 >= 80) {
	// flag = false;
	// break;
	// }
	// ans[l + 1] = 1;
	// }
	// l++;
	// j--;
	// }
	// break;
	// }
	//
	// ans[l] += (x[i] + y[j]);
	// if (ans[l] >= 10) {
	// ans[l] -= 10;
	// if (l + 1 >= 80) {
	// flag = false;
	// break;
	// }
	// ans[l + 1] = 1;
	// }
	// l++;
	// i--;
	// j--;
	// }
	//
	// if (!flag) {
	// System.out.println("overflow");
	// }
	// else {
	// if (ans[l] == 1) {
	// l++;
	// }
	// for (int m = l - 1; m >= 0; m--) {
	// System.out.print(ans[m]);
	// }
	// System.out.println();
	// }
	//
	// }
	//
	// sc.close();
	// }

	public static void main(String[] args) {
		new Main().run();
	}

}

C++: #include <iostream>
#include <cstdio>
using namespace std;
int main(){
  int n;
  cin >> n;
  while(n--){

  string num1,num2;
  cin >> num1 >> num2;

  if(num1.size() < num2.size())swap(num1,num2);
  if(num1.size() > 80){
    cout << "overflow" << endl;
    continue;
  }
  int m = num1.size()-num2.size();
  int M = num1.size();
  string n1="",n2="";
  for(int i = 0 ; i < m ; i++ )n2+='0';
  n2 = n2 + num2;
  string nn1="",nn2="";
  for(int i = M-1 ; i >= 0 ; i-- ){
    nn1+=num1[i];
    nn2+=n2[i];
  }
  string ans="",ansi="";
  int t = 0;

  for(int i = 0 ; i < num1.size() ; i++ ){
    if(t + (nn1[i] - '0') + (nn2[i] - '0') >= 10){
      ans += (t + (nn1[i] - '0') + (nn2[i] - '0') - 10) + '0' ;
      t = 1;
    } else {
      ans += (char)(t + (nn1[i]-'0') + (nn2[i]-'0') + '0');
      t = 0;
    }
  }

    if(t==1)ans+='1';
    for(int i = ans.size()-1 ; i >= 0 ; i--){
      ansi += ans[i];
    }
    if(ansi.size() > 80){
      cout << "overflow" << endl;
    }else cout << ansi << endl;
    }
  return 0;
}

C++: #include <iostream>
#include <string>
#define MAX 80

using namespace std;

int main()
{
	int n;
	cin >> n;
	for (int counter = 0; counter < n; counter++){
		string a, b;
		cin >> a >> b;
		if (a.length() > MAX || b.length() > MAX){
			cout << "overflow" << endl;
			continue;
		}
		if (a.length() == 1 || b.length() == 1 && a[0] == 0 && b[0] == 0){
			cout << 0 << endl;
			continue;
		}
		int inta[MAX + 2], intb[MAX + 2], sum[MAX + 2];
		fill(inta, inta + MAX + 2, 0);
		fill(intb, intb + MAX + 2, 0);
		fill(sum, sum + MAX + 2, 0);
		for (int i = 0; i < (signed)a.length(); i++){
			inta[i] = a[a.length() - i - 1] - '0';
		}
		for (int i = 0; i < (signed)b.length(); i++){
			intb[i] = b[b.length() - i - 1] - '0';
		}

		int over = 0;
		for (int i = 0; i < MAX + 2; i++){
			sum[i] = inta[i] + intb[i] + over;
			if (sum[i] >= 10){
				sum[i] %= 10;
				over = 1;
			}
			else{
				over = 0;
			}
		}

		for (int i = MAX + 1;; i--){
			if (sum[i] != 0){
				if (i >= MAX){
					cout << "overflow" << endl;
					break;
				}
				for (int j = i; j >= 0; j--){
					cout << sum[j];
				}
				cout << endl;
				break;
			}
		}
	}
	return 0;
}