1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <stdio.h> #include <limits.h> #define C_ASSERT(expr) extern char CAssertExtern[(expr)?1:-1] #if UINT_MAX >= 0xFFFFFFFF typedef unsigned int uint32; #else typedef unsigned long uint32; #endif typedef unsigned long long uint64; typedef unsigned long ulong; // Make sure uint32=32 bits and uint64=64 bits C_ASSERT(sizeof(uint32) * CHAR_BIT == 32); C_ASSERT(sizeof(uint64) * CHAR_BIT == 64); int div64by32eq64(uint64* dividend, uint32 divisor) { uint32 dividendHi = (uint32)(*dividend >> 32); uint32 dividendLo = (uint32)*dividend; uint32 quotientHi; uint32 quotientLo; if (divisor == 0) return 0; // This can be done as one 32-bit DIV, e.g. "div ecx" quotientHi = dividendHi / divisor; dividendHi = dividendHi % divisor; // This can be done as another 32-bit DIV, e.g. "div ecx" quotientLo = (uint32)((((uint64)dividendHi << 32) + dividendLo) / divisor); *dividend = ((uint64)quotientHi << 32) + quotientLo; return 1; } int main(void) { static const struct { uint64 dividend; uint32 divisor; } testData[] = { { 1 , 0 }, { 0xFFFFFFFFFFFFFFFFULL, 1 }, { 0xFFFFFFFFFFFFFFFFULL, 2 }, { 0xFFFFFFFF00000000ULL, 0xFFFFFFFFUL }, { 0xFFFFFFFFFFFFFFFFULL, 0xFFFFFFFFUL }, }; int i; for (i = 0; i < sizeof(testData)/sizeof(testData[0]); i++) { uint64 dividend = testData[i].dividend; uint32 divisor = testData[i].divisor; printf("0x%016llX / 0x%08lX = ", dividend, (ulong)divisor); if (div64by32eq64(÷nd, divisor)) printf("0x%016llX\n", dividend); else printf("division by 0 error\n"); } return 0; } |
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KCiNkZWZpbmUgQ19BU1NFUlQoZXhwcikgZXh0ZXJuIGNoYXIgQ0Fzc2VydEV4dGVyblsoZXhwcik/MTotMV0KCiNpZiBVSU5UX01BWCA+PSAweEZGRkZGRkZGCnR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMjsKI2Vsc2UKdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVpbnQzMjsKI2VuZGlmCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NDsKCnR5cGVkZWYgdW5zaWduZWQgbG9uZyB1bG9uZzsKCi8vIE1ha2Ugc3VyZSB1aW50MzI9MzIgYml0cyBhbmQgdWludDY0PTY0IGJpdHMKQ19BU1NFUlQoc2l6ZW9mKHVpbnQzMikgKiBDSEFSX0JJVCA9PSAzMik7CkNfQVNTRVJUKHNpemVvZih1aW50NjQpICogQ0hBUl9CSVQgPT0gNjQpOwoKaW50IGRpdjY0YnkzMmVxNjQodWludDY0KiBkaXZpZGVuZCwgdWludDMyIGRpdmlzb3IpCnsKICB1aW50MzIgZGl2aWRlbmRIaSA9ICh1aW50MzIpKCpkaXZpZGVuZCA+PiAzMik7CiAgdWludDMyIGRpdmlkZW5kTG8gPSAodWludDMyKSpkaXZpZGVuZDsKICB1aW50MzIgcXVvdGllbnRIaTsKICB1aW50MzIgcXVvdGllbnRMbzsKCiAgaWYgKGRpdmlzb3IgPT0gMCkKICAgIHJldHVybiAwOwoKICAvLyBUaGlzIGNhbiBiZSBkb25lIGFzIG9uZSAzMi1iaXQgRElWLCBlLmcuICJkaXYgZWN4IgogIHF1b3RpZW50SGkgPSBkaXZpZGVuZEhpIC8gZGl2aXNvcjsKICBkaXZpZGVuZEhpID0gZGl2aWRlbmRIaSAlIGRpdmlzb3I7CgogIC8vIFRoaXMgY2FuIGJlIGRvbmUgYXMgYW5vdGhlciAzMi1iaXQgRElWLCBlLmcuICJkaXYgZWN4IgogIHF1b3RpZW50TG8gPSAodWludDMyKSgoKCh1aW50NjQpZGl2aWRlbmRIaSA8PCAzMikgKyBkaXZpZGVuZExvKSAvIGRpdmlzb3IpOwoKICAqZGl2aWRlbmQgPSAoKHVpbnQ2NClxdW90aWVudEhpIDw8IDMyKSArIHF1b3RpZW50TG87CgogIHJldHVybiAxOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgc3RhdGljIGNvbnN0IHN0cnVjdAogIHsKICAgIHVpbnQ2NCBkaXZpZGVuZDsKICAgIHVpbnQzMiBkaXZpc29yOwogIH0gdGVzdERhdGFbXSA9CiAgewogICAgeyAxICwgMCB9LAogICAgeyAweEZGRkZGRkZGRkZGRkZGRkZVTEwsIDEgfSwKICAgIHsgMHhGRkZGRkZGRkZGRkZGRkZGVUxMLCAyIH0sCiAgICB7IDB4RkZGRkZGRkYwMDAwMDAwMFVMTCwgMHhGRkZGRkZGRlVMIH0sCiAgICB7IDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwgMHhGRkZGRkZGRlVMIH0sCiAgfTsKICBpbnQgaTsKCiAgZm9yIChpID0gMDsgaSA8IHNpemVvZih0ZXN0RGF0YSkvc2l6ZW9mKHRlc3REYXRhWzBdKTsgaSsrKQogIHsKICAgIHVpbnQ2NCBkaXZpZGVuZCA9IHRlc3REYXRhW2ldLmRpdmlkZW5kOwogICAgdWludDMyIGRpdmlzb3IgPSB0ZXN0RGF0YVtpXS5kaXZpc29yOwoKICAgIHByaW50ZigiMHglMDE2bGxYIC8gMHglMDhsWCA9ICIsIGRpdmlkZW5kLCAodWxvbmcpZGl2aXNvcik7CgogICAgaWYgKGRpdjY0YnkzMmVxNjQoJmRpdmlkZW5kLCBkaXZpc29yKSkKICAgICAgcHJpbnRmKCIweCUwMTZsbFhcbiIsIGRpdmlkZW5kKTsKICAgIGVsc2UKICAgICAgcHJpbnRmKCJkaXZpc2lvbiBieSAwIGVycm9yXG4iKTsKICB9CgogIHJldHVybiAwOwp9Cg==
-
upload with new input
-
result: Success time: 0.01s memory: 1676 kB returned value: 0
0x0000000000000001 / 0x00000000 = division by 0 error 0xFFFFFFFFFFFFFFFF / 0x00000001 = 0xFFFFFFFFFFFFFFFF 0xFFFFFFFFFFFFFFFF / 0x00000002 = 0x7FFFFFFFFFFFFFFF 0xFFFFFFFF00000000 / 0xFFFFFFFF = 0x0000000100000000 0xFFFFFFFFFFFFFFFF / 0xFFFFFFFF = 0x0000000100000001


