只是说我的类型值uint64_t被视为八位字节序列(1个八位字节= 8位).uint64_t已知该值仅包含MSB位置的一个设置位.因此,该uint64_t值可以是以下二进制表示之一:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 10000000 pos = 7
00000000 00000000 00000000 00000000 00000000 00000000 10000000 00000000 pos = 15
00000000 00000000 00000000 00000000 00000000 10000000 00000000 00000000 pos = 23
00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000 pos = 31
00000000 00000000 00000000 10000000 00000000 00000000 00000000 00000000 pos = 39
00000000 00000000 10000000 00000000 00000000 00000000 00000000 00000000 pos = 47
00000000 10000000 00000000 00000000 …Run Code Online (Sandbox Code Playgroud) 我很抱歉提出一个非常基本的问题.请考虑以下示例:
const
c1 = 1; // Is this Byte or ShortInt?
c2 = 1234; // Is this Word or Smallint?
c3 = 123456; // Is this Cardinal or Integer?
Run Code Online (Sandbox Code Playgroud)
阅读本文档后,我可以得出结论,负值被解释为有符号,正值被解释为无符号.但是,例如123456(根据文档将被解释为Cardinal)也可以在上下文中使用Integer,我的意思是它用Integer在计算中使用常量的变量中.因此,是否始终保证不断地将Cardinal类型转换为Integer必要的?
这个问题的背景是......我正试图int popcount_3(uint64_t x)从维基百科中移植C函数:汉明重量,但它的算法不是这个问题的焦点.
假设x是无符号64位值的最大数量(即x = 18446744073709551615),在计算结束时,C代码将计算:
uint64_t iResult = 578721382704613384ull * 72340172838076673ull;
Run Code Online (Sandbox Code Playgroud)
首先我怀疑C代码引发了溢出错误,因为使用浮点乘法时操作的实际/实际结果等于41864804849942400000000000000000000,但事实上,该C代码没有编译错误.输出为4627501566018457608.
我们知道,上面C代码的Delphi代码是:
iResult := UInt64(578721382704613384) * UInt64(72340172838076673);
Run Code Online (Sandbox Code Playgroud)
Delphi编译器在转换或算术运算中引发错误E2099溢出.好的,我看到错误是合理的.
所以,我的问题是......对于超大数字的乘法,等效的Delphi代码是什么,以便Delphi给出与C相同的结果?
预测即将发生的潜在问题"为什么我使用真正的常量表达式提供示例?" ,原因是我想创建一个真常量,通过计算设置位数来计算计算机字中的位数High(NativeUInt).
GCC 4.8.1(MinGW)
#include <stdio.h>
#include <stdint.h>
int main () {
uint64_t iResult = 578721382704613384ull * 72340172838076673ull;
printf("iResult = %llu\n", iResult); // output --> 4627501566018457608
return 0; …Run Code Online (Sandbox Code Playgroud) function MyFunc(const Value: Integer): Integer;
const
MyArray: array[0..255] of Byte = ( ... ); // values of the array here
begin
... // Some codes here
Result := Integer(MyArray[Value shr 58]);
end;
Run Code Online (Sandbox Code Playgroud)
会声明MyArray外面MyFunc增加反复调用的性能MyFunc吗?
为了避免函数中可能出现的错误,我需要预先检查TSysCharSet类型(或AnsiChar集合)的变量是否未分配.我该怎么做?
procedure TestSysCharSet(const AnsiCharSet: TSysCharSet);
begin
if PByte(@AnsiCharSet) = nil then WriteLn('The AnsiCharSet is unassigned.')
else if AnsiCharSet = [] then WriteLn('The AnsiCharSet is empty.');
end;
procedure Test();
var
AnsiCharSet: TSysCharSet;
begin
// The AnsiCharSet is intentionally made unassigned
TestSysCharSet(AnsiCharSet);
ReadLn;
end;
begin
Test();
end.
Run Code Online (Sandbox Code Playgroud)
提前致谢.