要素很多哈,我们先说 Java 的。
Java官方文档说了,An integer literal is of typelongif it ends with the letterLorl; otherwise it is of typeint. 换句话说,0xffffffff 的数据类型 type 只能是 int,0xffffffffL 的类型 type 只能是 long。另外 Java 的 int 和 long 都是默认 signed,都是从负数到正数的。(当然 Java 8 之后,这里有更新,某些情况下 int 和 long 也能 represent unsigned 的值,具体请看。)
如果不是 8个f,是9个f,long x = 0xfffffffff,那么 Java 会报错 The literal 0xfffffffff of type int is out of range 。间接说明了确实 0xffffffff 的类型被 Java 确定为(定死了是) int 。所以 @jinchamL 说的,我觉得是很对。我自己在 Java SE 8 的版本下,测试过了,结果也是一致的。(不清楚为啥你的结果不一样。。你的 Java/JDK 的版本是。。?)
那么为啥 C 里面的值不一样呢?
简而言之是因为 C 里面有 unsigned int,当然这里要先假设C语言的编辑器/硬件规定了 int 的大小是 4个 byte 而且 long 的大小是 8 个 byte,不然也可能输出不一样的值。所以 C语言下的 0xffffffff 先会被尝试能不能是 int 类型,不行的话尝试一下能不能是 unsigned int 类型,最终确定是 unsigned int 类型,因为 int 的范围里面没有 0xffffffff 这个数字大小(十进制的4294967295 / 2^32 - 1)。如果 unsigned int 不行的话就试试 long int 再 unsigned long int,以此类推,更多信息可以看这个 stackoverflow 的 link。
当然你写了 long x=(long)0xffffffff; 这里面的 (long) 是我上面说的都做完了,然后才会做 (long) 的 casting 。
最后的最后,我自己在B站上传的免费编程入门视频,专注于入门,由浅入深地服务零基础的同学们。里面一开始把计算机和C语言的最基础最重要的概念讲清楚 ➕ 代码示例和自己实时写代码测试。里面的所有的资料和代码都是公开在我的百度网盘里面https://www.bilibili.com/video/av65793738/www.bilibili.com
谢谢哈