为什么是“int i = 2147483647 + 1;”OK,但是“byte b = 127 + 1;”不可编译?(Why is “int i = 2147483647 + 1;” OK, but “byte b = 127 + 1;” is not compilable?)
为什么int i = 2147483647 + 1; OK,但是byte b = 127 + 1; 不可编译?
Why is int i = 2147483647 + 1; OK, but byte b = 127 + 1; is not compilable?
原文:https://stackoverflow.com/questions/6889176
更新时间:2019-11-22 17:19
最满意答案
常量被评估为int,所以2147483647 + 1溢出,并给你一个新的int,它可以分配给int ,而127 + 1也被评估为int等于128 ,并且它不能分配给byte 。
Constants are evaluated as ints, so 2147483647 + 1 overflows and gives you a new int, which is assignable to int, while 127 + 1 also evaluated as int equals to 128, and it is not assignable to byte.
2011-07-31
相关问答
-127-127基本上是一个带符号的字节。 对于Delphi中的那个,您可以使用ShortInt,请参见此处: http://www.delphibasics.co.uk/RTL.asp?Name=ShortInt -127-127 is basically a signed byte. For that in Delphi you can use a ShortInt, see here: http://www.delphibasics.co.uk/RTL.asp?Name=ShortInt
常量被评估为int,所以2147483647 + 1溢出,并给你一个新的int,它可以分配给int ,而127 + 1也被评估为int等于128 ,并且它不能分配给byte 。 Constants are evaluated as ints, so 2147483647 + 1 overflows and gives you a new int, which is assignable to int, while 127 + 1 also evaluated as int equals to 12
...
这是因为byte是一个使用二进制补码的有符号数据类型。 并且248-256等于-8 。 It's because byte is a signed data type which uses two's complement. And 248-256 is equal to -8.
在您的情况下,值9999999999存储为float 。 您可以使用var_dump(9999999999)进行验证。 当它被转换为有符号整数时,该值被截断为32位,其值为1410065407 。 您可以手动或使用GMP数学扩展来验证此计算: $num = gmp_init("9999999999");
$bits = gmp_pow(2, 32);
var_dump(gmp_strval(gmp_mod($num, $bits)));
// string(10) "1410065407"
I
...
正如NPE所说,这是UTF-8的编码 - 128到2047(8 - 11位)之间的字节转换为两个字节:如果原始的11位是abcdefghijk,则utf-8版本是110abcde 10fghijk。 在您的示例中(填充左侧为0以生成11位),00010000000将转换为11000010 10000000或\ xc2 \ x80,这正是您所看到的。 有关更多信息,请参阅有关UTF-8的维基百科文章 您可以在python中看到这个代码(我用128替换int('10000000',base = 2):
...
实际上read返回一个整数.. public abstract int read() throws IOException
所以它通过将其存储在一个int中被隐式转换为无符号字节。 正如文件中所述: 从输入流中读取下一个字节的数据。 值字节在0到255范围内作为int返回。如果由于已到达流末尾而没有可用的字节,则返回值-1。 考虑一下这样一个事实,如果它是一个有符号的字节,那么-1不能用作流结束值。 对于OutputStream你有 public abstract void write(int
...
这通常是不正确的。 实际上, JVM规范§2.3中概述了这一点 : Java虚拟机支持的原始数据类型是数字类型, boolean类型( §2.3.4 )和returnAddress类型( §2.3.3 )。 数字类型由整数类型( §2.3.1 )和浮点类型( §2.3.2 )组成。 整体类型是: byte ,其值为8位有符号二进制补码整数,其默认值为零 short ,其值为16位有符号二进制补码整数,其默认值为零 int ,其值为32位带符号的二进制补码整数,其默认值为零 long ,其值为64位
...
根据草案N1256(C99)§6.3.1.4,您正在调用未定义的行为: 6.3.1.4实数浮点数和整数 当实数浮动类型的有限值被转换为除_Bool之外的整数类型时,小数部分被丢弃(即,该值被截断为零)。 如果整数部分的值不能用整数类型表示,则行为是未定义的。 50) 当整数类型的值转换为实际浮动类型时,如果正在转换的值可以在新类型中准确表示,则它将保持不变。 如果转换的值在可以表示但不能精确表示的值的范围内,则结果是以实现定义的方式选择的最接近的较高或最接近的较低可表示值。 如果要转换的值超出可以
...
问题在于基于你定义的id类型的MySQL。 最大的int值是2147483647.查看他们的文档: https : //dev.mysql.com/doc/refman/5.5/en/integer-types.html 其他选项: 签名BIGINT可以让你到9223372036854775807 无符号BIGINT可以让你到18446744073709551615 DECIMAL的最大位数是65 (有关更多详细信息,请参阅https://dev.mysql.com/doc/refman/5.0/
...
忽略你正在做的好坏,编码ISO-8859-1将其所有字符映射到Unicode中具有相同代码的字符。 // Bytes with all the possible values 0-255
var bytes = Enumerable.Range(0, 256).Select(p => (byte)p).ToArray();
// String containing the values
var all1bytechars = new string(bytes.Select(p => (char)
...