尝试使用Swift模拟C联合会给出运行时异常

劳伦特

在C中:

typedef unsigned char u8;
typedef unsigned short u16;

typedef union {
  struct { u8 l,h; } b;
  u16 w;
} Register;

在Swift中(使用带有关联值的枚举):

enum Register {
    case b(UInt8, UInt8)
    case w(UInt16)

    var l: UInt8 {
        switch(self) {
        case .b(let l, _): return l
        case .w(let w): return UInt8(w)
        }
    }

    var h: UInt8 {
        switch(self) {
        case .b(_, let h): return h
        case .w(let w): return UInt8(w >> 8)
        }
    }

    var w: UInt16 {
        switch(self) {
        case .b(let l, let h): return UInt16(l | (h << 8))
        case .w(let w): return w
        }
    }
}

这有效:

let regA = Register.b(255, 0)
print(regA.l)
print(regA.h)
let regB = Register.w(UInt16(256))
print(regB.w)

但这不会导致运行时异常:

print(regA.w)
print(regB.l)
print(regB.h)

我无法找出问题,因为在枚举定义中跟踪该问题似乎非常不可能。

瓦瓦瓦玛

我看到两个问题。

对于问题1,您正在创建一个UInt8from UInt16,如果您不限制该值,它将溢出。您可以使用UInt8(truncatingBitPattern: w)UInt8(w & 0xff)

对于问题2,lh在声明中UInt16(l | (h << 8))UInt8值,所以你四溢UInt8,你需要转换到UInt16 之前移位和或-ING。

您的代码现在可以进行以下2种修改:

enum Register {
    case b(UInt8, UInt8)
    case w(UInt16)

    var l: UInt8 {
        switch(self) {
        case .b(let l, _): return l
        case .w(let w): return UInt8(w & 0xff)  // issue 1
        }
    }

    var h: UInt8 {
        switch(self) {
        case .b(_, let h): return h
        case .w(let w): return UInt8(w >> 8)
        }
    }

    var w: UInt16 {
        switch(self) {
        case .b(let l, let h): return UInt16(l) | UInt16(h) << 8  // issue 2
        case .w(let w): return w
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这会给出运行时浮点错误?

来自分类Dev

在枚举上重载<<运算符会给出运行时错误

来自分类Dev

为什么这会给出运行时浮点错误?

来自分类Dev

cout给出运行时错误

来自分类Dev

va_arg给出运行时错误

来自分类Dev

flask sqlalchemy filter_by给出运行时错误

来自分类Dev

performSegueWithIdentifier给出运行时错误,为什么?

来自分类Dev

为什么我的代码给出运行时错误?

来自分类Dev

在android中给出运行时短信权限错误

来自分类Dev

在线判断给出运行时错误(NZEC)

来自分类Dev

什么时候抛出运行时异常?

来自分类Dev

如何使@NotNull抛出运行时异常?

来自分类Dev

防止在Java中退出运行时异常循环

来自分类Dev

有什么需要抛出运行时异常

来自分类Dev

如何使@NotNull抛出运行时异常?

来自分类Dev

堆栈溢出运行时错误C ++

来自分类Dev

为什么此代码编译并在执行时给出运行时错误

来自分类Dev

为什么会出现这种使用泛型不会抛出运行时或编译时的异常?

来自分类Dev

当我尝试在模拟器上运行时,Android Studio返回“转换异常”错误

来自分类Dev

当我尝试从HashSet中删除不存在的元素时,为什么它没有给出运行时错误?

来自分类Dev

当我尝试从不存在的HashSet中删除元素时,为什么它没有给出运行时错误?

来自分类Dev

设置iDoc = IE.Document在VBA中给出运行时错误

来自分类Dev

VBA UserForm为其参数之一给出运行时错误91

来自分类Dev

为什么以下条件运算符“?:”会编译却给出运行时错误

来自分类Dev

在SSMS中正常运行时,为什么在c#中调用存储过程会给出InvalidOperationException?

来自分类Dev

使用iframe进行联合会话历史记录向后导航

来自分类Dev

即使使用yarn运行时存在映射器,Map-reduce作业仍会给ClassNotFound异常?

来自分类Dev

通过运行时给出的类型拦截异常

来自分类Dev

以下代码在 ideone 中给出运行时错误,但在 eclipse 和 bash 终端中运行良好

Related 相关文章

  1. 1

    为什么这会给出运行时浮点错误?

  2. 2

    在枚举上重载<<运算符会给出运行时错误

  3. 3

    为什么这会给出运行时浮点错误?

  4. 4

    cout给出运行时错误

  5. 5

    va_arg给出运行时错误

  6. 6

    flask sqlalchemy filter_by给出运行时错误

  7. 7

    performSegueWithIdentifier给出运行时错误,为什么?

  8. 8

    为什么我的代码给出运行时错误?

  9. 9

    在android中给出运行时短信权限错误

  10. 10

    在线判断给出运行时错误(NZEC)

  11. 11

    什么时候抛出运行时异常?

  12. 12

    如何使@NotNull抛出运行时异常?

  13. 13

    防止在Java中退出运行时异常循环

  14. 14

    有什么需要抛出运行时异常

  15. 15

    如何使@NotNull抛出运行时异常?

  16. 16

    堆栈溢出运行时错误C ++

  17. 17

    为什么此代码编译并在执行时给出运行时错误

  18. 18

    为什么会出现这种使用泛型不会抛出运行时或编译时的异常?

  19. 19

    当我尝试在模拟器上运行时,Android Studio返回“转换异常”错误

  20. 20

    当我尝试从HashSet中删除不存在的元素时,为什么它没有给出运行时错误?

  21. 21

    当我尝试从不存在的HashSet中删除元素时,为什么它没有给出运行时错误?

  22. 22

    设置iDoc = IE.Document在VBA中给出运行时错误

  23. 23

    VBA UserForm为其参数之一给出运行时错误91

  24. 24

    为什么以下条件运算符“?:”会编译却给出运行时错误

  25. 25

    在SSMS中正常运行时,为什么在c#中调用存储过程会给出InvalidOperationException?

  26. 26

    使用iframe进行联合会话历史记录向后导航

  27. 27

    即使使用yarn运行时存在映射器,Map-reduce作业仍会给ClassNotFound异常?

  28. 28

    通过运行时给出的类型拦截异常

  29. 29

    以下代码在 ideone 中给出运行时错误,但在 eclipse 和 bash 终端中运行良好

热门标签

归档