{"id":1310,"date":"2013-10-01T18:37:41","date_gmt":"2013-10-01T18:37:41","guid":{"rendered":"https:\/\/clarionsharp.com\/blog\/?p=1310"},"modified":"2013-10-01T18:37:41","modified_gmt":"2013-10-01T18:37:41","slug":"working-with-64bit-signed-and-unsigned-integers","status":"publish","type":"post","link":"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/","title":{"rendered":"Working with 64bit Signed and Unsigned integers"},"content":{"rendered":"<p>Clarion 9.x will introduce RTL support to work with 64-bit signed and unsigned integers.\u00a0 The RTL has 19 functions (so far) which provide a means to assign values, add, subtract, multiply, divide, bit-shift, convert to\/from decimals, and more.<\/p>\n<p>How to define (applicable for FILE structures or variables):<br \/>\n! Declarations of INT64 and UINT64 types used in prototypes<br \/>\n!<br \/>\n! INT64\u00a0\u00a0\u00a0 GROUP,TYPE<br \/>\n! lo\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ULONG<br \/>\n! hi\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LONG<br \/>\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END<br \/>\n!<br \/>\n! UINT64\u00a0\u00a0 GROUP,TYPE<br \/>\n! lo\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ULONG<br \/>\n! hi\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ULONG<br \/>\n!\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 END<\/p>\n<p>List of functions:<br \/>\ni64Sign \u2013 return the sign<br \/>\ni64Negate &#8211; change the sign like the unary operator for numbers<br \/>\ni64ABS &#8211; equivalent to ABS()<br \/>\ni64Is0 &#8211; check for equality to 0<br \/>\nis32Bit &#8211; check the high half of number to be equal to 0<br \/>\ni64Assign &#8211; equivalent to the = assignment operator<br \/>\ni64To32 \u2013 take the lower 32 bits of the value<br \/>\ni64FromDecimal &#8211; direct DECIMAL to 64-bit integer conversion<br \/>\ni64ToDecimal &#8211; direct 64-bit integer to DECIMAL conversion<br \/>\ni64Shift &#8211; equivalent to BSHIFT (value, n)<br \/>\ni64LShift &#8211; equivalent to BSHIFT (value, n) if n is positive<br \/>\ni64RShift &#8211; equivalent to BSHIFT (value, -n) if n is positive<br \/>\ni64Add &#8211; equivalent to binary + operator<br \/>\ni64Sub &#8211; equivalent to binary &#8211; operator<br \/>\ni64Mult2 &#8211; equivalent to n*=2<br \/>\ni64Mult10 &#8211; equivalent to n=n*10+k<br \/>\ni64Mult &#8211; equivalent to * operator<br \/>\ni64Div10 &#8211; equivalent to x=n%10; n\/=10<br \/>\ni64Div &#8211; equivalent to \/ operator<\/p>\n<p>i64Div10 and i64Div for signed 64-bit integers assume that the define(compatible_modulus) pragma is set to &#8220;on&#8221;.<\/p>\n<p>The i64.INC is self-documenting<br \/>\nMODULE(&#8216;i64* family of RTL functions&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Returns sign of passed 64-bit signed integer<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit signed integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if passed value is 0, -1 if paased value is negative, +1 if passed value is positive.&lt;\/returns&gt;<br \/>\ni64Sign\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),SIGNED,RAW,NAME(&#8216;Cla$i64Sign&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Negates value of passed signed 64-bit signed integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit signed integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow.&lt;\/returns&gt;<br \/>\ni64Negate\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Negate&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Negates value of passed signed 64 bit signed integer variable if it is<br \/>\n!!! negative<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit signed integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow.&lt;\/returns&gt;<br \/>\ni64ABS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64ABS&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Compares value of passed 64-bit integer with 0<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;TRUE if passed value is 0.&lt;\/returns&gt;<br \/>\ni64Is0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),BOOL,RAW,NAME(&#8216;Cla$i64is0&#8217;)<br \/>\ni64Is0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v),BOOL,RAW,NAME(&#8216;Cla$i64is0&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Checks that value of passed 64-bit integer can be stored to 32-bit<br \/>\n!!! integer without truncating<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;Reference to 64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;TRUE if passed value has significant bits in lower ULONG only.&lt;\/returns&gt;<br \/>\nis32Bit\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),BOOL,RAW,NAME(&#8216;Cla$is32Bit&#8217;)<br \/>\nis32Bit\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v),BOOL,RAW,NAME(&#8216;Cla$is32BitU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Assign 32-bit value to passed 64-bit integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to change.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;Value to assign to destination variable.&lt;\/param&gt;<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest, LONG src),RAW,NAME(&#8216;Cla$i64AssignS&#8217;)<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, ULONG src),RAW,NAME(&#8216;Cla$i64AssignU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Assign 64-bit value to passed 64-bit integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to change.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;Value to assign to destination variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow or truncation.&lt;\/returns&gt;<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest,\u00a0 *INT64\u00a0 src),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64AssignSS&#8217;)<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest,\u00a0 *UINT64 src),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64AssignSU&#8217;)<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, *INT64\u00a0 src),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64AssignUS&#8217;)<br \/>\ni64Assign\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, *UINT64 src),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64AssignUU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store 64-bit integer value to 32-bit integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;32-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of truncation&lt;\/returns&gt;<br \/>\ni64To32\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 src, *LONG dest),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64To32&#8217;)<br \/>\ni64To32\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 src, *ULONG dest),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64To32U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store DECIMAL value to 64-bit integer variable<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;DECIMAL value to assign to 64-bit integer variable.&lt;\/param&gt;<br \/>\ni64FromDecimal PROCEDURE (*INT64\u00a0 dest, *DECIMAL src),RAW,NAME(&#8216;Cla$i64FromDecS&#8217;)<br \/>\ni64FromDecimal PROCEDURE (*UINT64 dest, *DECIMAL src),RAW,NAME(&#8216;Cla$i64FromDecU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store 64-bit integer value to DECIMAL variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;DECIMAL variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to store to DECIMAL variable.&lt;\/param&gt;<br \/>\ni64ToDecimal\u00a0\u00a0 PROCEDURE (*DECIMAL dest, *INT64\u00a0 src),RAW,NAME(&#8216;Cla$i64ToDecS&#8217;)<br \/>\ni64ToDecimal\u00a0\u00a0 PROCEDURE (*DECIMAL dest, *UINT64 src),RAW,NAME(&#8216;Cla$i64ToDecU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Shift value of 64-bit integer value to given number of bits to left or<br \/>\n!!! to right and store result to another 64-bit integer variable. Shift is<br \/>\n!!! to right if shift count value is negative, and is to left if shift count<br \/>\n!!! value is positive. The same variable can be passed both as a source value<br \/>\n!!! and as a destination variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;cnt&#8221;&gt;Number of bits to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to store result to.&lt;\/param&gt;<br \/>\ni64Shift\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 src, SIGNED cnt, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64Shift&#8217;)<br \/>\ni64Shift\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 src, SIGNED cnt, *UINT64 dest),RAW,NAME(&#8216;Cla$i64ShiftU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Shift value of 64-bit variable to left to given number of bits and store<br \/>\n!!! result to another 64-bit integer variable. The same variable can be passed<br \/>\n!!! both as a source value and as a destination variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;cnt&#8221;&gt;Number of bits to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to store result to.&lt;\/param&gt;<br \/>\ni64LShift\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 src, UNSIGNED cnt, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64LShift&#8217;)<br \/>\ni64LShift\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 src, UNSIGNED cnt, *UINT64 dest),RAW,NAME(&#8216;Cla$i64LShiftU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Shift value of 64-bit variable to right to given number of bits and store<br \/>\n!!! result to another 64-bit integer variable. The same variable can be passed<br \/>\n!!! both as a source value and as a destination variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;cnt&#8221;&gt;Number of bits to shift.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to store result to.&lt;\/param&gt;<br \/>\ni64RShift\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 src, UNSIGNED cnt, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64RShift&#8217;)<br \/>\ni64RShift\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 src, UNSIGNED cnt, *UINT64 dest),RAW,NAME(&#8216;Cla$i64RShiftU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Add value of one 64-bit integer variable to another one. Possible overflow<br \/>\n!!! is ignored.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to increase by value of another variabke.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to add to value of destination variable.&lt;\/param&gt;<br \/>\ni64Add\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest,\u00a0 *INT64 src),RAW,NAME(&#8216;Cla$i64Add&#8217;)<br \/>\ni64Add\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, *UINT64 src),RAW,NAME(&#8216;Cla$i64Add&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Subtract value of one 64-bit integer variable from another one. Possible<br \/>\n!!! overflow is ignored.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;64-bit integer variable to increase by value of another variabke.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;src&#8221;&gt;64-bit integer value to add to value of destination variable.&lt;\/param&gt;<br \/>\ni64Sub\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 dest,\u00a0 *INT64 src),RAW,NAME(&#8216;Cla$i64Sub&#8217;)<br \/>\ni64Sub\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 dest, *UINT64 src),RAW,NAME(&#8216;Cla$i64Sub&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Assign sum of two 64-bit integer values to passed 64-bit integer variable.<br \/>\n!!! The same variable can be passed as one of operands and as a destination.<br \/>\n!!! Possible overflow is ignored.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;First 64-bit integer operand.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;Second 64-bit integer operand.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store the result.&lt;\/param&gt;<br \/>\ni64Add\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 op1, *INT64\u00a0 op2, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64Add3&#8217;)<br \/>\ni64Add\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 op1, *UINT64 op2, *UINT64 dest),RAW,NAME(&#8216;Cla$i64Add3U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Assign result of subtraction of two 64-bit integer values to passed 64-bit<br \/>\n!!! integer variable. The same variable can be passed as one of operands and<br \/>\n!!! as a destination. Possible overflow is ignored.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;First 64-bit integer operand of subtraction.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;Second 64-bit integer operand of subtraction.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store the result.&lt;\/param&gt;<br \/>\ni64Sub\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 op1, *INT64\u00a0 op2, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64Sub3&#8217;)<br \/>\ni64Sub\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 op1, *UINT64 op2, *UINT64 dest),RAW,NAME(&#8216;Cla$i64Sub3U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Multiply value of 64-bit integer variable by 2<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow.&lt;\/returns&gt;<br \/>\ni64Mult2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 v),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Mult2&#8217;)<br \/>\ni64Mult2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Mult2U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Multiply value of 64-bit integer variable by 10, add passed 32-bit value<br \/>\n!!! and store result back to variable<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;inc&#8221;&gt;32-bit integer increment value.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of overflow.&lt;\/returns&gt;<br \/>\ni64Mult10\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 v, LONG\u00a0 inc = 0),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Mult10&#8217;)<br \/>\ni64Mult10\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v, ULONG inc = 0),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Mult10U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Multiply two 64-bit integer values and store result to passed 64-bit<br \/>\n!!! integer variable. The same variable can be passed as one of parameters<br \/>\n!!! and as a destination. Possible overflow is ignored.<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;64-bit integer multiplier.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;64-bit integer multiplicand.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store result.&lt;\/param&gt;<br \/>\ni64Mult\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 op1, *INT64\u00a0 op2, *INT64\u00a0 dest),RAW,NAME(&#8216;Cla$i64Mult&#8217;)<br \/>\ni64Mult\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 op1, *UINT64 op2, *UINT64 dest),RAW,NAME(&#8216;Cla$i64MultU&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Divide value of 64-bit integer variable to 10 and store quotient back to<br \/>\n!!! variable. The remainder is stored to 32-bit integer variable. Value of<br \/>\n!!! remainder is positive always.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;v&#8221;&gt;64-bit integer variable.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;rem&#8221;&gt;32-bit integer variable to store remainder.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of errors.&lt;\/returns&gt;<br \/>\ni64Div10\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64\u00a0 v, *LONG rem),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Div10&#8217;)<br \/>\ni64Div10\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 v, *LONG rem),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Div10U&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store result of division of two 64-bit signed integer values to passed<br \/>\n!!! 64-bit variable. The same variable can be passed as one of operands and<br \/>\n!!! as a destination variable.<br \/>\n!!!<br \/>\n!!! Result corresponds to value of define(compatible_modulus) pragma set to &#8220;on&#8221;<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;64-bit integer dividend.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;64-bit integer divisor.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store quotient.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of errors.&lt;\/returns&gt;<br \/>\ni64Div\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*INT64 op1, *INT64 op2, *INT64 dest),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64Div&#8217;)<\/p>\n<p>!!! &lt;summary&gt;<br \/>\n!!! Store result of division of two 64-bit unsigned integer values to passed<br \/>\n!!! 64-bit variable. The same variable can be passed as one of operands and<br \/>\n!!! as a destination variable.<br \/>\n!!! &lt;\/summary&gt;<br \/>\n!!! &lt;param name=&#8221;op1&#8243;&gt;64-bit integer dividend.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;op2&#8243;&gt;64-bit integer divisor.&lt;\/param&gt;<br \/>\n!!! &lt;param name=&#8221;dest&#8221;&gt;Variable to store quotient.&lt;\/param&gt;<br \/>\n!!! &lt;returns&gt;0 if operation successful, other value in case of errors.&lt;\/returns&gt;<br \/>\ni64Div\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PROCEDURE (*UINT64 op1, *UINT64 op2, *UINT64 dest),UNSIGNED,PROC,RAW,NAME(&#8216;Cla$i64DivU&#8217;)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Clarion 9.x will introduce RTL support to work with 64-bit signed and unsigned integers.\u00a0 The RTL has 19 functions (so far) which provide a means to assign values, add, subtract, multiply, divide, bit-shift, convert to\/from decimals, and more. How to define (applicable for FILE structures or variables): ! Declarations of INT64 and UINT64 types used &hellip; <a href=\"https:\/\/clarionsharp.com\/blog\/working-with-64bit-signed-and-unsigned-integers\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Working with 64bit Signed and Unsigned integers<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1310","post","type-post","status-publish","format-standard","hentry","category-clarionnews"],"_links":{"self":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/comments?post=1310"}],"version-history":[{"count":9,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1310\/revisions"}],"predecessor-version":[{"id":1319,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1310\/revisions\/1319"}],"wp:attachment":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/media?parent=1310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/categories?post=1310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/tags?post=1310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}