number casting to type

Dear all,

I needed to cast numbers to specific types (i.e. int16, uint16, etc.) so I wrote the following code, which may be an indication of a bug or an oversight on my behalf. Could you please verify either way?


structure struct_type
	char byte
	uchar ubyte
	int16 int16
	uint16 uint16
	int32 int
	int32 int32
	uint32 uint
	uint32 uint32
	float float
	float flt16
	double double
	double flt32
endstructure

function cast(var, type)
	variable var
	string type
	
	struct struct_type r
	
	strswitch(type)
		case "byte":
			r.byte = var; var = r.byte
			break
		case "ubyte":
			r.ubyte = var; var = r.ubyte
			break
		case "int16":
			r.int16 = var; var = r.int16
			break
		case "uint16":
			r.uint16 = var; var = r.uint16
			break
		case "int":
		case "int32":
			r.int32 = var; var = r.int32
			break
		case "uint":
		case "uint32":
			r.uint32 = var; var = r.uint32
			break
		case "flt16":
		case "float":
			r.float = var; var = r.float
			break
		case "flt32":
		case "double":
			r.double = var; var = r.double
			break
	endswitch
	
	return var
end


And compare the results of:

•variable a
•a = cast(-5, "uint16"); print a
  65531
•a = cast(-5, "uint32"); print a
  0


I would expect the second call (
a = cast(-5, "uint32")
) to set
variable a
to:
4294967291
, the 2 complement of -5.
Looks like a bug. If you can use IP7 I'd use
matrixop




•make/d/N=1 data = -5
•matrixop/o result = uint16(-5)
•print result
  result[0]= {65531}
•matrixop/o result = uint32(-5)
•print/D result
  result[0]= {4294967291}
thomas_braun wrote: Looks like a bug. If you can use IP7 I'd use
matrixop




•make/d/N=1 data = -5
•matrixop/o result = uint16(-5)
•print result
  result[0]= {65531}
•matrixop/o result = uint32(-5)
•print/D result
  result[0]= {4294967291}


Thanks for letting me know about this feature in IP7. It is way more pleasant to the eye like that.

While we are on the topic, does the uint32 struct field also return/ store 0 in the case of -5 in IP7 as well?

best,
_sk