基础语法(整型:uint、uint8、uint16、uint32、uint64、uintptr)

整型范围

Int8 - [-128 : 127]
Int16 - [-32768 : 32767]
Int32 - [-2147483648 : 2147483647]
Int64 - [-9223372036854775808 : 9223372036854775807]

无符号整型范围

UInt8 - [0 : 255]
UInt16 - [0 : 65535]
UInt32 - [0 : 4294967295]
UInt64 - [0 : 18446744073709551615]

再看一下 davecheney 大神的回复:

uint is a variable sized type, on your 64 bit computer uint is 64 bits wide.

我的理解uint类型长度取决于 CPU,如果是32位CPU就是4个字节,如果是64位就是8个字节。我的电脑是64位的,而 playground 是32位的,问题就出在这里。

More

这里就会出现一个情况,int和uint是根据 CPU 变化的,如何知道当前系统的情况?

  • CPU 型号:runtime.GOARCH
  • int的长度:strconv.IntSize

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这句话是对指针 `p` 进行位运算的操作,目的是将指针地址的 3 位清零,但保留其它位。具体来说: 1. `(uintptr_t)p` 将指针 `p` 转化为无符号整型数值,以便进行位运算。 2. `((uintptr_t) -1)` 表示 -1 转化为无符号整型数值,即所有二进制位均为 1。 3. `((uintptr_t) -1) << 3` 表示将该无符号整型数值左移 3 位,即将 1 左移 3 位得到 1000(二进制)。 4. `((uintptr_t) -1) << 3` 得到的结果为一个掩码,该掩码的 3 位为 0,其它位都为 1。 5. `((uintptr_t)p & (((uintptr_t) -1) << 3))` 表示将指针 `p` 的地址与上述掩码进行按位与运算,即将 3 位清零,但保留其它位。 6. 最后,将结果强制转化为 `uint64_t*` 类型,赋值给指针变量 `p`。这样,指针 `p` 就被修改为其地址的 3 位为 0,但保留其它位的值。 ### 回答2: 这段代码涉及指针类型转换和位运算操作。 首先,代码中的 `(uintptr_t)p` 将指针变量 `p` 的地址值强制转换为无符号整数类型 `uintptr_t`。`uintptr_t` 在不同的平台上可以是不同的数据类型,但它通常被定义为足够大的整数类型以存储指针的地址值。这个转换的目的是为了对指针进行位运算操作。 接着,代码将转换后的无符号整数类型值再次转换为 `uint64_t` 类型的指针,即 `uint64_t *`。这个操作的目的是将之前转换为整数类型的地址值重新解释为指向 `uint64_t` 类型数据的指针。 需要注意的是,这段代码存在潜在的问题和风险。具体而言,指针类型转换时需要特别小心,因为如果不正确地对指针进行类型转换,可能会导致对错误内存区域的读写操作,从而引发未定义行为和内存错误。此外,对于 `uintptr_t` 类型的精确定义因平台而异,因此在编写跨平台代码时需要格外小心和谨慎。 ### 回答3: & ~0x3F); 的含义是什么? 这段代码的含义是将指针p的值截断为 uintptr_t 类型的值,然后将该值的最6位设置为0,然后再转换回 uint64_t 指针类型。 首先,uintptr_t 是一个无符号整数类型,用于存储指针的特定位模式。强制类型转换 `(uintptr_t) p` 将指针p的值转换为 uintptr_t 类型的整数。 接下来,`& ~0x3F` 将生成一个掩码,用于将整数的最6位设置为0。这里使用的掩码是 0x3F,它的二进制表示为 00111111。通过使用位求反操作符 `~` 对该数字取反,我们得到一个掩码,它的二进制表示为 11000000。然后,使用按位与操作符 `&`对整数值和掩码进行按位与运算,将最6位设置为0。 最后,使用外层的强制类型转换 `(uint64_t *)` 将处理后的整数值转换回 uint64_t 指针类型。这样最终得到的指针p具有与原始指针p相同的内存地址,但最6位被设置为0,其余位保持不变。 通过这样的操作,代码的目的可能是对指针进行对齐,将指针的最6位设置为0,以满足某些内存对齐的要求或优化需要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值