【发布时间】:2023-03-18 03:32:01
【问题描述】:
当您打开 IOKit/usb/USB.h 时,您会看到如下常量:
#define err_system(x) (signed((unsigned(x) & 0x3f) << 26))
#define err_sub(x) ((x & 0xfff) << 14)
#define sys_iokit err_system(0x38)
#define sub_iokit_usb err_sub(1)
#define iokit_usb_err(return) (IOReturn)(sys_iokit|sub_iokit_usb|return)
//Then all errors are defined like:
#define kIOUSBUnknownPipeErr iokit_usb_err(0x61) //0xe0004061
kIOUSBTooManyPipesErr iokit_usb_err(0x60) //0xe0004060
.
.
所以我决定快速尝试一下:
private enum IOUSBError: IOReturn {
case unknownPipeErr = 0xe0004061
case tooManyPipesErr = 0xe0004060
.
.
}
但它给出了错误:"Integer literal '3758112865' overflows when stored into 'IOReturn' (aka 'Int32')"
对于每一个枚举案例..
知道如何故意允许这样做吗?
【问题讨论】:
-
C 代码采用无符号 32 位数字并将其转换为有符号 32 位数字。这在 C 中有效。在 Swift 中,你得到了溢出。您需要在 Swift 中执行一些技巧以将 32 位无符号值粘贴到 32 位有符号变量(大小写)中。
-
@rmaddy;这适用于常量,但不适用于 Swift 中的枚举 :(
-
0xe0004061是-0x1fffbf9f和0xe0004060是-0x1fffbfa0当从无符号转换为有符号时。 -
使用
print(String(Int32(bitPattern: 0xe0004060), radix: 16))进行转换。
标签: swift