Tag: uint64

Swift转换C的uint64_t与使用自己的UInt64类型不同

我正在将应用程序从(Objective-)C移植到Swift,但必须使用用C编写的第三方框架。有一些不兼容的东西,比如typedef,它们被解释为Int,但必须传递给框架的function如UInts等。 因此,为了避免整个Swift应用程序中的常量转换操作,我决定将C头文件传输到Swift,所有类型的II都需要它们在一个地方。 我能够转移几乎所有的东西,并克服了很多障碍,但这一个: C头定义了一个包含uint64_t变量的结构。 此结构用于将数据作为指针传输到回调函数。 回调函数将void指针作为参数,我必须使用UnsafeMutablePointer操作将其转换为结构的类型(或者如果合适的话,还是标题的另一个结构)。 只要我使用导入时由Swift自动转换的C头中的原始结构,所有的转换和内存访问都可以正常工作。 但是,在Swift中手动复制结构并不是“字节匹配”。 让我向您展示一个这种情况的简化示例: 在CApiHeader.h文件中有类似的东西 typedef struct{ uint32_t var01; uint64_t var02; uint8_t arr[2]; }MyStruct, *MyStructPtr; 根据我的理解,这里应该是Swift的等价物 struct MyStruct{ var01: UInt32 var02: UInt64 arr: (UInt8, UInt8) } 或者也应该有效的是这种元组符号 typealias MyStruct = ( var01: UInt32, var02: UInt64, arr: (UInt8, UInt8) ) 这可以正常工作,但不是只有UInt64类型。 好的,那会发生什么? 将指针转换为我自己的Swift MyStruct实现之一,从UInt64字段开始,将孔数据移位2个字节。 因此,在此示例中,两个arr字段都不在正确的位置,但在UInt64位内,其数量应为64。 所以它的接缝是UInt64字段只有48位。 这符合我的观察,如果我用这个替代品替换UIn64变量 struct MyStruct{ var01: UInt32 […]

在x86机器上移位超过32位的uint64_t整数未定义的行为?

学习困难的方法,我试图在x86机器上留下很long long和uint64_t到超过32位的结果为0 。 我依稀记得曾经读过某个地方,而不是32位机器移位操作符只能在前32位工作但不能重新收集源。 我想知道是否在x86机器上移动超过32位的uint64_t整数是未定义的行为?

sprintf for unsigned _int64

我有以下代码。 sprintf中第二个%d的输出始终显示为零。 我想我指的是错误的说明符。 任何人都可以帮助我获得具有正确值的写字符串。 这必须以posix标准实现。 感谢您的投入 void main() { unsigned _int64 dbFileSize = 99; unsigned _int64 fileSize = 100; char buf[128]; memset(buf, 0x00, 128); sprintf(buf, “\nOD DB File Size = %d bytes \t XML file size = %d bytes”, fileSize, dbFileSize); printf(“The string is %s “, buf); } 输出: The string is OD DB File […]