【初心者歓迎】C/C++室 Ver.82【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.82【環境依存OK】 - 暇つぶし2ch62:デフォルトの名無しさん
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で計算して判定すれば?


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch