【发布时间】:2016-03-21 23:49:19
【问题描述】:
我正在尝试测试 C 中 short、int 和 long 的有符号和无符号版本的相等性。特别是,我使用了以下测试代码:
#include <stdio.h>
int main() {
signed short ss = 0x8000; // 2^15
unsigned short us = 0x8000;
printf("ss = %i, us = %i\n", ss, us);
if (ss == us) { printf("ss == us\n"); }
else { printf("ss != us\n"); }
signed int si = 0x80000000; // 2^31
unsigned int ui = 0x80000000;
printf("si = %i, ui = %i\n", si, ui);
if (si == ui) { printf("si == ui\n"); }
else { printf("si != ui\n"); }
signed long sl = 0x8000000000000000L; // 2^63
unsigned long ul = 0x8000000000000000UL; // 2^63
printf("sl = %li, ul = %lu\n", sl, ul);
if (sl == ul) { printf("si == ui\n"); }
else { printf("sl != ul\n"); }
}
代码输出如下:
ss = -32768, us = 32768
ss != us
si = -2147483648, ui = -2147483648
si == ui
sl = -9223372036854775808, ul = 9223372036854775808
si == ui
所以对于短裤来说,它们是不相等的,但对于其他两条来说,它们是相等的。我的假设是否有问题,或者这只是 C 的一个已知怪癖?
【问题讨论】:
-
这不是怪癖,而是标准行为。
-
您没有在
printf语句中进行类似的比较:在前两个(但不是第三个示例)中,您对有符号和无符号值都使用%i(有符号整数),它打印被告知放置在堆栈上的数据。一旦到了那里,除了上下文之外,就无法判断它们是签名还是未签名。在short的情况下,值在放入堆栈之前被提升为signed int和unsigned int(因为变量类型),然后由于%i说明符而打印为signed int。
标签: c long-integer unsigned integer-overflow short