【发布时间】:2020-05-05 18:35:54
【问题描述】:
我正在做一个项目,我需要获取一系列带符号的 16 位整数、负值和正值,并将它们发送到函数以在单元测试期间进行分析。
由于不同的原因,该函数只接受一个无符号 16 位整数数组,因此我需要将有符号整数存储在一个无符号 16 位整数数组中,并完全保留相同的位模式。我正在使用 gcc (Debian 8.3.0-6) 8.3.0。
unsigned short arr[450];
unsigned short arrIndex = 0;
for (short i = -32768; i < (32767 - 100) ; i = i + 100 )
{
arr[arrIndex] = i;
printf("short value is : %d\n", i);
printf("unsigned short value is : %d\n", arr[arrIndex]);
arrIndex++;
}
即使我告诉 printf 打印带符号的值,我也很惊讶地发现,对于小于零的值,位模式实际上是不同的。前几个值如下:
short value is : -32768
unsigned short value is : 32768
short value is : -32668
unsigned short value is : 32868
short value is : -32568
unsigned short value is : 32968
这里发生了什么,我将如何保留低于零的 i 值的位模式?
【问题讨论】:
-
“有符号的 16 位整数”实际上是指“有符号的 16 位整数”,而您的
int是 32 位而不是 16 位? -
@WeatherVane 这就是我的意思,给格式说明符 %d.. 我期待看到负值
-
@WeatherVane 如果我将我的 cmets 改为“shorts”而不是“ints”,你会更开心吗?
-
您需要明确
%d的期望以及“整数”的含义。最小的int大小为 16 位。根据通常的整数提升规则,小于原生int的可变参数函数的整数参数将被提升为int。如果您的int是 32 位,则它可以处理signed short和unsigned short的整个范围。 -
...编译器不会调整提升以适应格式说明符。 (出于善意,它只会发出关于类型兼容性的警告消息)。
标签: c type-conversion data-conversion unsigned signed