#include<stdio.h>
// unsigned int、桁あふれの判定
// (unsigned int のサイズは不問)
int isOverflow_uint(unsigned int x, unsigned int y)
{
#define UI8H (sizeof(unsigned int) * 8 / 2)
return
(1 << UI8H)
&
(
((x >> UI8H) + (y >> UI8H))
+
(
(
(
(x & ((unsigned int)~0 >> UI8H))
+
(y & ((unsigned int)~0 >> UI8H))
)
&
(1 << UI8H)
) ? 1 : 0
)
);
}
int main()
{
unsigned int a, b;
a = 0xFFFFfffe; // 32bitだとして…
b = 0x00000001;
printf("0x%08X + 0x%08X ~ 桁あふれ %s\n", a
, b
, isOverflow_uint
(a
, b
) ? "する" : "しない");
a = 0xFFFFfffe;
b = 0x00000002;
printf("0x%08X + 0x%08X ~ 桁あふれ %s\n", a
, b
, isOverflow_uint
(a
, b
) ? "する" : "しない");
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KCi8vIHVuc2lnbmVkIGludOOAgeahgeOBguOBteOCjOOBruWIpOWumgovLyAgICAodW5zaWduZWQgaW50IOOBruOCteOCpOOCuuOBr+S4jeWVjykKaW50IGlzT3ZlcmZsb3dfdWludCh1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHkpCnsKICAgICNkZWZpbmUgVUk4SCAgKHNpemVvZih1bnNpZ25lZCBpbnQpICogOCAvIDIpCiAgICByZXR1cm4KICAgICAgICAoMSA8PCBVSThIKQogICAgICAgICAgICAmCiAgICAgICAgKAogICAgICAgICAgICAoKHggPj4gVUk4SCkgKyAoeSA+PiBVSThIKSkgCiAgICAgICAgICAgICAgICArCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICh4ICYgKCh1bnNpZ25lZCBpbnQpfjAgPj4gVUk4SCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArCiAgICAgICAgICAgICAgICAgICAgICAgICh5ICYgKCh1bnNpZ25lZCBpbnQpfjAgPj4gVUk4SCkpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAmCiAgICAgICAgICAgICAgICAgICAgKDEgPDwgVUk4SCkKICAgICAgICAgICAgICAgICkgPyAxIDogMAogICAgICAgICAgICApCiAgICAgICAgKTsKfQoKaW50IG1haW4oKQp7CiAgICB1bnNpZ25lZCBpbnQgYSwgYjsKCiAgICBhID0gMHhGRkZGZmZmZTsgICAgICAgICAgICAgLy8gMzJiaXTjgaDjgajjgZfjgabigKYKICAgIGIgPSAweDAwMDAwMDAxOwogICAgcHJpbnRmKCIweCUwOFggKyAweCUwOFgg772eIOahgeOBguOBteOCjCAlc1xuIiwgYSwgYiwgaXNPdmVyZmxvd191aW50KGEsIGIpID8gIuOBmeOCiyIgOiAi44GX44Gq44GEIik7CgogICAgYSA9IDB4RkZGRmZmZmU7CiAgICBiID0gMHgwMDAwMDAwMjsKICAgIHByaW50ZigiMHglMDhYICsgMHglMDhYIO+9niDmoYHjgYLjgbXjgowgJXNcbiIsIGEsIGIsIGlzT3ZlcmZsb3dfdWludChhLCBiKSA/ICLjgZnjgosiIDogIuOBl+OBquOBhCIpOwoKICAgIHJldHVybiAwOwp9