[C语言] 64位运算
2010-11-18 18:40
155 查看
/* File Name: main.c File Desc: Test for u64 function with gcc 3.4.5 File Version: 1.0.0 Authour: Tody Kwok (c) Tody 2010, T-ware Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <stdio.h> #include <stdlib.h> #include "u64.h" struct abc{ // unsigned int y; // unsigned long z; char x; int y; }; int main(int argc, char* argv[]) { u64 a , b, c; struct abc d; a = u64hilo(0x00e0, 0x12345678); b = u64hilo(0x0000, 0xF0000000); c = u64plus(a , b); printf("%08x%08x", c.hi, c.lo); // Result: 000000e012345681 printf("/nchar: %d, int: %d, long: %d/n abc: %d, u64: %d", sizeof(char), sizeof(int), sizeof(long), sizeof(d), sizeof(u64)); // _getch(); return 0; }
Test.c
u64.h
/* uint64_t-like operations that work even on hosts lacking uint64_t Copyright (C) 2006 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ /* Written by Paul Eggert. */ #include <stddef.h> #include <stdint.h> /* Return X rotated left by N bits, where 0 < N < 64. */ #define u64rol(x, n) u64or (u64shl (x, n), u64shr (x, 64 - n)) #ifndef UINT64_MAX //not define MAX 64 /* Native implementations are trivial. See below for comments on what these operations do. */ typedef uint64_t u64; # define u64hilo(hi, lo) ((u64) (((u64) (hi) << 32) + (lo))) # define u64init(hi, lo) u64hilo (hi, lo) # define u64lo(x) ((u64) (x)) # define u64lt(x, y) ((x) < (y)) # define u64and(x, y) ((x) & (y)) # define u64or(x, y) ((x) | (y)) # define u64xor(x, y) ((x) ^ (y)) # define u64plus(x, y) ((x) + (y)) # define u64shl(x, n) ((x) << (n)) # define u64shr(x, n) ((x) >> (n)) #else /* u64 is a 64-bit unsigned integer value. u64init (HI, LO), is like u64hilo (HI, LO), but for use in initializer contexts. */ # ifdef WORDS_BIGENDIAN typedef struct { uint32_t hi, lo; } u64; # define u64init(hi, lo) { hi, lo } # else typedef struct { uint32_t lo, hi; } u64; # define u64init(hi, lo) { lo, hi } # endif /* Given the high and low-order 32-bit quantities HI and LO, return a u64 value representing (HI << 32) + LO. */ static inline u64 u64hilo (uint32_t hi, uint32_t lo) { u64 r; r.hi = hi; r.lo = lo; return r; } /* Return a u64 value representing LO. */ static inline u64 u64lo (uint32_t lo) { u64 r; r.hi = 0; r.lo = lo; return r; } /* Return X < Y. */ static inline int u64lt (u64 x, u64 y) { return x.hi < y.hi || (x.hi == y.hi && x.lo < y.lo); } /* Return X & Y. */ static inline u64 u64and (u64 x, u64 y) { u64 r; r.hi = x.hi & y.hi; r.lo = x.lo & y.lo; return r; } /* Return X | Y. */ static inline u64 u64or (u64 x, u64 y) { u64 r; r.hi = x.hi | y.hi; r.lo = x.lo | y.lo; return r; } /* Return X ^ Y. */ static inline u64 u64xor (u64 x, u64 y) { u64 r; r.hi = x.hi ^ y.hi; r.lo = x.lo ^ y.lo; return r; } /* Return X + Y. */ static inline u64 u64plus (u64 x, u64 y) { u64 r; r.lo = x.lo + y.lo; r.hi = x.hi + y.hi + (r.lo < x.lo); return r; } /* Return X << N. */ static inline u64 u64shl (u64 x, int n) { u64 r; if (n < 32) { r.hi = (x.hi << n) | (x.lo >> (32 - n)); r.lo = x.lo << n; } else { r.hi = x.lo << (n - 32); r.lo = 0; } return r; } /* Return X >> N. */ static inline u64 u64shr (u64 x, int n) { u64 r; if (n < 32) { r.hi = x.hi >> n; r.lo = (x.hi << (32 - n)) | (x.lo >> n); } else { r.hi = 0; r.lo = x.hi >> (n - 32); } return r; } #endif
相关文章推荐
- C语言中的运算符优先级
- 华为2014年机试题【100以内正整数的加、减运算】-【C语言/C++】
- C语言实现大数四则运算
- c语言高精度大整数加法运算
- 四则运算(C语言)
- C语言原码反码补码与位运算.
- 【C语言】07-基本语句和运算
- 基于C语言的稀疏矩阵的压缩存储和运算
- C语言按位运算
- C语言概述、数据类型、运算表达式、程序结构
- c语言的数值运算
- C语言的关系运算
- C语言中 移位操作运算
- 基础之路02,C语言中的指针之间的算术运算
- C语言中不同数据类型间混合运算的转换规则
- 《c专家编程》笔记--c语言中算术运算优先级高于移位运算
- C语言的位运算的优势 !
- 黑马程序员 c语言----进制 位运算学习
- C语言负数的移位运算
- C语言运算中的数据类型自动转换原则