Vistaが発売されれば、int型が64bitになってしまうかもしれませんが。
現状は、int型は32bit(DWORD)なので64bit(QWORD)の整数演算は素直にできません。
で、なんとなく作ってみました。足し算と引き算だけですが。
多分、あってるとおもいます。
Windowsに付属の電卓は64bitで演算できますけどね・・・。
では、サンプルです。
現状は、int型は32bit(DWORD)なので64bit(QWORD)の整数演算は素直にできません。
で、なんとなく作ってみました。足し算と引き算だけですが。
多分、あってるとおもいます。
Windowsに付属の電卓は64bitで演算できますけどね・・・。
では、サンプルです。
//64bitの足し算
//引数
// hi1 : 足される数の上位DWORD
// low1 : 足される数の下位DWORD
// hi2 : 足す数の上位DWORD
// low2 : 足す数の下位DWORD
// hi_a : 答えの上位DWORD
// low_a : 答えの下位DWORD
bool AdditionQWORD(DWORD hi1,DWORD low1,DWORD hi2,DWORD low2,DWORD *hi_a,DWORD *low_a)
{
//64bitの引き算
//引数
// hi1 : 引かれる数の上位DWORD
// low1 : 引かれる数の下位DWORD
// hi2 : 引く数の上位DWORD
// low2 : 引く数の下位DWORD
// hi_a : 答えの上位DWORD
// low_a : 答えの下位DWORD
//num1 >= num2であること
bool SubtractionQWORD(DWORD hi1,DWORD low1,DWORD hi2,DWORD low2,DWORD *hi_a,DWORD *low_a)
{
//引数
// hi1 : 足される数の上位DWORD
// low1 : 足される数の下位DWORD
// hi2 : 足す数の上位DWORD
// low2 : 足す数の下位DWORD
// hi_a : 答えの上位DWORD
// low_a : 答えの下位DWORD
bool AdditionQWORD(DWORD hi1,DWORD low1,DWORD hi2,DWORD low2,DWORD *hi_a,DWORD *low_a)
{
DWORD low,hi;
DWORD low_t;
if(hi_a == NULL || low_a == NULL){
//下位DWORDの計算
if(((low1 >> 1) + (low2 >> 1)) < 0x80000000){ //下位DWORDのオーバーフローチェック
//上位DWORDの計算
if(((hi1 >> 1) + (hi2 >> 1)) < 0x80000000){ //上位DWORDのオーバーフローチェック
//結果の代入
*hi_a = hi;
*low_a = low;
return true;
}DWORD low_t;
if(hi_a == NULL || low_a == NULL){
return false;
}//下位DWORDの計算
if(((low1 >> 1) + (low2 >> 1)) < 0x80000000){ //下位DWORDのオーバーフローチェック
low = low1 + low2;
}else{
//オーバーフロー
low = (low1 & 0x0fffffff) + (low2 & 0x0fffffff); //最上位の桁を除いて加算
low_t = ((low1 & 0xf0000000) >> 8) + ((low2 & 0xf0000000) >> 8); //最上位の桁だけをいったん右へシフトして加算
low_t <<= 8;
low += low_t;
hi1++; //繰り上がり
}low = (low1 & 0x0fffffff) + (low2 & 0x0fffffff); //最上位の桁を除いて加算
low_t = ((low1 & 0xf0000000) >> 8) + ((low2 & 0xf0000000) >> 8); //最上位の桁だけをいったん右へシフトして加算
low_t <<= 8;
low += low_t;
hi1++; //繰り上がり
//上位DWORDの計算
if(((hi1 >> 1) + (hi2 >> 1)) < 0x80000000){ //上位DWORDのオーバーフローチェック
hi = hi1 + hi2;
}else{
//オーバーフロー
*hi_a = 0;
*low_a = 0;
return false;
}*hi_a = 0;
*low_a = 0;
return false;
//結果の代入
*hi_a = hi;
*low_a = low;
return true;
//64bitの引き算
//引数
// hi1 : 引かれる数の上位DWORD
// low1 : 引かれる数の下位DWORD
// hi2 : 引く数の上位DWORD
// low2 : 引く数の下位DWORD
// hi_a : 答えの上位DWORD
// low_a : 答えの下位DWORD
//num1 >= num2であること
bool SubtractionQWORD(DWORD hi1,DWORD low1,DWORD hi2,DWORD low2,DWORD *hi_a,DWORD *low_a)
{
DWORD low,hi;
if(hi_a == NULL || low_a == NULL){
if(hi1 < hi2 || (hi1 == hi2 && low1 < low2)){
//下位DWORDの計算
if(low1 >= low2){
//上位DWORDの計算
hi = hi - hi2;
//結果の代入
*hi_a = hi;
*low_a = low;
return true;
}if(hi_a == NULL || low_a == NULL){
return false;
}if(hi1 < hi2 || (hi1 == hi2 && low1 < low2)){
*hi_a = 0;
*low_a = 0;
return false;
}*low_a = 0;
return false;
//下位DWORDの計算
if(low1 >= low2){
//引かれる数が大きければ単純に引く
low = low1 - low2;
hi = hi1;
}else{low = low1 - low2;
hi = hi1;
//引かれる数が小さい場合は、逆に引く
low = low2 - low1;
low = 0xffffffff - low;
low++; //これ重要
hi = hi1 - 1; //繰り下がり
}low = low2 - low1;
low = 0xffffffff - low;
low++; //これ重要
hi = hi1 - 1; //繰り下がり
//上位DWORDの計算
hi = hi - hi2;
//結果の代入
*hi_a = hi;
*low_a = low;
return true;