看看这个C代码:
int main()
{
unsigned int y = 10;
int x = -2;
if (x > y)
printf("x is greater");
else
printf("y is greater");
return 0;
}
/*Output: x is greater.*/
Run Code Online (Sandbox Code Playgroud)
我理解为什么输出是x更大,因为当计算机比较它们时,x被提升为无符号整数类型.当x被提升为无符号整数时,-2变为65534,绝对大于10.
但是为什么在C#中,等效代码会产生相反的结果呢?
public static void Main(String[] args)
{
uint y = 10;
int x = -2;
if (x > y)
{
Console.WriteLine("x is greater");
}
else
{
Console.WriteLine("y is greater");
}
}
//Output: y is greater.
Run Code Online (Sandbox Code Playgroud) 在Linux上使用gcc版本4.8.4,short是16位,int是32位.
#include "stdio.h"
int main( void ){
unsigned short u = 0xaabb;
unsigned int v = 0xaabb;
printf ("%08x %08x\n", u, (unsigned short)((u*0x10001)/0x100));
printf ("%08x %08x\n", v, (unsigned short)((v*0x10001)/0x100));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果:
0000aabb 0000bbab
0000aabb 0000bbaa
Run Code Online (Sandbox Code Playgroud)
这可以改变,例如,通过除以0x10,其为第一种情况产生类似的结果(+1).如果截断的字节/0x100小于0x80 ,则不会发生这种效应.第一种情况(short u)的机器代码看起来好像是要进行一些舍入(添加0xFF).
#include <stdio.h>
int arr[] = {1,2,3,4,5,6,7,8};
#define SIZE (sizeof(arr)/sizeof(int))
int main()
{
printf("SIZE = %d\n", SIZE);
if ((-1) < SIZE)
printf("less");
else
printf("more");
}
Run Code Online (Sandbox Code Playgroud)
编译后的输出gcc是"more".为什么if条件,即使失败-1 < 8?