13/02/05 23:24:39.91
だからbit数保証したいならtypedef使えと・・・
stdint.h があるならそれ使うといいが
ない環境を考えるなら自前で定義だな
63:デフォルトの名無しさん
13/02/05 23:41:33.21
C言語でintが64bitでないのは64bit環境ではない
64:デフォルトの名無しさん
13/02/05 23:48:59.40
マヌケはレスする資格無し
65:デフォルトの名無しさん
13/02/06 02:50:48.25
long long と勘違いしているのに 100 ペリカ
66:デフォルトの名無しさん
13/02/06 07:54:49.94
solarisだよ。ううん知らないけど
67:デフォルトの名無しさん
13/02/06 13:11:05.92
unsigned int 同士の足し算で桁あふれ検知したいんだけど
キャストなしで先に検知する方法あるかな
68:デフォルトの名無しさん
13/02/06 13:13:03.69
レジスタ見ればいいんじゃね
69:デフォルトの名無しさん
13/02/06 13:29:17.54
unsigned x,y;
unsigned msk=0xffff; // 32bit
unsigned w=(x&msk)+(y&msk);
unsigned u=(x>> 16)+(y>> 16)+(w>> 16);
if (u>> 16){ ・・・// OF
やっぱフラグレジスタ見れ
70:デフォルトの名無しさん
13/02/06 13:30:18.96
>>61
サンクス
じゃあ安心だ
71:デフォルトの名無しさん
13/02/06 13:34:46.37
int8_t, int16_t, int32_t, int_32_t とか使えばいいんじゃ
72:デフォルトの名無しさん
13/02/06 14:22:03.12
>>67
x86でVC++ならこんな風にできるけど、ちょっとなあ・・・
unsigned int a = 0x80000001;
unsigned int b = 0x80000002;
unsigned int sum;
bool overflow;
sum = a + b;
__asm
{
jc OF
mov [overflow], 0
jmp END_OF
OF:
mov [overflow], 1
END_OF:
}
// sum == 3, overflow = true
73:デフォルトの名無しさん
13/02/06 14:25:16.18
>>67
URLリンク(ideone.com)
あまり美しくないけど
74:デフォルトの名無しさん
13/02/06 15:04:10.77
2で割って足して、先頭bitを確認するとか?
余った分を足すのを忘れないように
75:デフォルトの名無しさん
13/02/06 15:06:27.48
#define isOverflow(x, y) (((x) + (y)) < (x) || ((x) + (y)) < (x))
76:デフォルトの名無しさん
13/02/06 15:07:51.80
>>75
間違った
×> #define isOverflow(x, y) (((x) + (y)) < (x) || ((x) + (y)) < (x))
○> #define isOverflow(x, y) (((x) + (y)) < (x) || ((x) + (y)) < (y))
77:デフォルトの名無しさん
13/02/06 15:20:07.55
>>76
片方だけでいいんちゃう?
78:デフォルトの名無しさん
13/02/06 15:27:34.92
#define isOverflow(x, y) (~(x) < (y) )
これでいいか
79:デフォルトの名無しさん
13/02/06 15:29:41.18
>>77
#define isOverflow(x, y) (((x) + (y)) < (x))
だけでいいね
>>74は
#define isOverflow(x, y) (((x) >> 1) + ((y) >> 1) + ((((x) & 1) + ((y) & 1)) >> 1) >= (1 << (sizeof(unsigned int) * 8 - 1)))
かな
80:デフォルトの名無しさん
13/02/06 15:37:39.60
uint32_t
isOverfloow(uint32_t x,uint32_t y)
{
uint32_t z;
uint32_t a;
a=x%2+y%2;
a/=2;
z=x/2+y/2;
z+=a;
return z&0x80000000;
}
81:79
13/02/06 15:52:30.85
>>80
ああ、そうだった。
ということで>>79は
×> #define isOverflow(x, y) (((x) >> 1) + ((y) >> 1) + ((((x) & 1) + ((y) & 1)) >> 1) >= (1 << (sizeof(unsigned int) * 8 - 1)))
○> #define isOverflow(x, y) (((x) >> 1) + ((y) >> 1) + ((((x) & 1) + ((y) & 1)) >> 1)) & (1 << (sizeof(unsigned int) * 8 - 1))
82:デフォルトの名無しさん
13/02/06 20:13:44.65
いっそのこと64bitで計算して判定すれば?