C,int64_t超出范围?

#include <stdio.h>  
#include <inttypes.h>

int main(void)
{
    //int64_t a=-(9223372036854775807)-1;    //-(2^63-1)-1,这么赋值不报警
    int64_t a=-9223372036854775808;            //-2^63,这样就报警
    printf("%zu\n", sizeof(int64_t));
    printf("%016lx\n", a);
}

运行结果如下:
图片说明
都能输出正确结果,但是第二种赋值会警告,编译器是不是只认识第一种写法?
规定了这么写?感觉真的怪,哈哈......

http://baike.baidu.com/link?url=vgqvZL9Gnr-3obi-i6GTRDVHh-acRNTpOf_a99Ve9BM4Z0K299MJkky0gxrpEu6_3h-R88kC4g_pzWPvb2yT0q