- Add integer conversion tests (signed/unsigned, truncation, extension) - Add float conversion tests (precision loss, special values, overflow) - Add untyped constant conversion tests - Add overflow and wrapping behavior tests These tests cover the gaps identified in the code review: 1. Signed/unsigned conversions with negative values 2. Truncation from larger to smaller integer types 3. Sign extension vs zero extension 4. Float-to-int conversions with overflow/saturation 5. Int-to-float conversions with precision loss 6. Untyped constants with typed variables 7. Integer overflow and wrapping behavior 8. Special float values (Inf, NaN) Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: cpunion <cpunion@users.noreply.github.com>
67 lines
2.4 KiB
Go
67 lines
2.4 KiB
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
func main() {
|
|
fmt.Println("=== Integer Type Conversions ===")
|
|
|
|
// 1. Signed/Unsigned conversions
|
|
fmt.Println("\n1. Negative to Unsigned:")
|
|
var negInt int32 = -1
|
|
fmt.Printf("int32(-1) -> uint32: %d (0x%X)\n", uint32(negInt), uint32(negInt))
|
|
fmt.Printf("int32(-1) -> uint8: %d (0x%X)\n", uint8(negInt), uint8(negInt))
|
|
|
|
var negInt64 int64 = -1234567890
|
|
fmt.Printf("int64(-1234567890) -> uint32: %d (0x%X)\n", uint32(negInt64), uint32(negInt64))
|
|
|
|
// 2. Large unsigned to signed
|
|
fmt.Println("\n2. Large Unsigned to Signed:")
|
|
var bigUint uint32 = 0xFFFFFFFF
|
|
fmt.Printf("uint32(0xFFFFFFFF) -> int32: %d\n", int32(bigUint))
|
|
fmt.Printf("uint32(0xFFFFFFFF) -> int16: %d\n", int16(bigUint))
|
|
|
|
var bigUint64 uint64 = 0xFFFFFFFFFFFFFFFF
|
|
fmt.Printf("uint64(max) -> int32: %d\n", int32(bigUint64))
|
|
|
|
// 3. Truncation (downward conversion)
|
|
fmt.Println("\n3. Truncation (Larger to Smaller):")
|
|
var i64 int64 = 0x123456789ABC
|
|
fmt.Printf("int64(0x123456789ABC) -> int32: 0x%X\n", int32(i64))
|
|
fmt.Printf("int64(0x123456789ABC) -> int16: 0x%X\n", int16(i64))
|
|
fmt.Printf("int64(0x123456789ABC) -> int8: 0x%X\n", int8(i64))
|
|
|
|
var u64 uint64 = 0xFFFFFFFFFFFFFFFF
|
|
fmt.Printf("uint64(max) -> uint32: 0x%X\n", uint32(u64))
|
|
fmt.Printf("uint64(max) -> uint16: 0x%X\n", uint16(u64))
|
|
fmt.Printf("uint64(max) -> uint8: 0x%X\n", uint8(u64))
|
|
|
|
// 4. Sign extension vs zero extension
|
|
fmt.Println("\n4. Sign Extension vs Zero Extension:")
|
|
var i8 int8 = -1
|
|
fmt.Printf("int8(-1) -> int16: %d (0x%04X)\n", int16(i8), uint16(int16(i8)))
|
|
fmt.Printf("int8(-1) -> int32: %d (0x%08X)\n", int32(i8), uint32(int32(i8)))
|
|
fmt.Printf("int8(-1) -> int64: %d (0x%016X)\n", int64(i8), uint64(int64(i8)))
|
|
|
|
var u8 uint8 = 0xFF
|
|
fmt.Printf("uint8(0xFF) -> uint16: %d (0x%04X)\n", uint16(u8), uint16(u8))
|
|
fmt.Printf("uint8(0xFF) -> uint32: %d (0x%08X)\n", uint32(u8), uint32(u8))
|
|
|
|
// 5. Mixed sign conversions with specific values
|
|
fmt.Println("\n5. Mixed Sign Conversions:")
|
|
var si16 int16 = -32768 // MinInt16
|
|
fmt.Printf("int16(MinInt16) -> uint16: %d\n", uint16(si16))
|
|
|
|
var su16 uint16 = 32768
|
|
fmt.Printf("uint16(32768) -> int16: %d\n", int16(su16))
|
|
|
|
// 6. Boundary values
|
|
fmt.Println("\n6. Boundary Value Conversions:")
|
|
var maxI8 int8 = 127
|
|
var minI8 int8 = -128
|
|
fmt.Printf("int8(MaxInt8=%d) -> uint8: %d\n", maxI8, uint8(maxI8))
|
|
fmt.Printf("int8(MinInt8=%d) -> uint8: %d\n", minI8, uint8(minI8))
|
|
|
|
var maxU8 uint8 = 255
|
|
fmt.Printf("uint8(MaxUint8=%d) -> int8: %d\n", maxU8, int8(maxU8))
|
|
}
|