unsigned long的困惑,该怎么解决

unsigned long的困惑
一段C代码:
unsigned   long   k;
k=   0xff000000;
printf( "%d ",k);
在VC下运行的结果:
-16777216

在TC下的结果为:
0

unsigned   long不是无符号吗?怎么会有负值输出?而TC的结果好像也不太对啊。
请大虾赐教◎

------解决方案--------------------
printf %d 的时候系统做了转换了,改成%u看看
------解决方案--------------------
printf( "%ul ",k); 应该这样吧,呵呵
------解决方案--------------------


sizeof(k)的结果是4,也就是32位的数呢,0xff000000还不至于溢出
=============
它没有溢出 unsigned long ,
但是printf( "%d ",k); //这个是输入一个 int,
0xff000000 溢出了 int 的范围了(没有溢出 unsigned int,但是溢出了 int范围)
------解决方案--------------------
0xff000000
只是跟和最高为有关。
当它是long型时,最高位为符号位。
当它是unsigned long型时,最高位就表示数值位了。
所以可以这么理解内存中的数永远是0或者1的序列,不表示正负
只是编译器解释的时候才把它当作某种类型,然后按照这种类型的内存布局进行解释。
比如printf( "%d ",k)就是按照int型来解释的,所以他把最高位当作符号位来用了
所以是-16777216