1.java如何定义long类型的变量
我详细说说吧
java中直接输入整数则默认为int类型,带有小数点的实数默认为double类型
如果你直接声明 long a = 123;这是没有错的,因为123是int类型,可以赋值给范围更大的long类型,但是如果你的数字超过int范围那得告诉编译器,你的数字已经大于int范围,要换成更大范围的long类型表示,所以数字后面加上L(或小写l)。比如 long a = 2147483648;(这样写会报错,因为int类型最大表示范围是2147483647) 得这样 long a = 2147483648L;
浮点数一样,后面加的是F/f (代表float类型)
2.long类型判断是否为空
long不能为空,因为它是简单数据类型,如果是Long就可以为空。
定义long的时候除非是类或是结构体中的属性,否则会要求你先赋初值的。如long a=0;作为属性时,系统会默认赋一个“0”值。所以一般情况,可以用if(a==0)来判断long值是否被改变。
扩展资料:
long标识符
可如下例所示声明并初始化 long 类型的变量:
复制代码
long long1 = 4294967296;如果整数没有后缀,则其类型为以下类型中可表示其值的第一个类型:int、uint、long、ulong。在上例中,它是 long 类型,因为它超出了 uint 的范围(有关整型的存储大小,请参见整型表(C# 参考))。
还可以像下面这样,在 long 类型中使用后缀 L:
复制代码
long long2 = 4294967296L;当使用后缀 L 时,将根据整数的大小确定它的类型为 long 还是 ulong。在此例中,它是 long,因为它小于 ulong 的范围的下限。
此后缀常用于调用重载方法。以下面使用 long 和 int 参数的重载方法为例:
复制代码
public static void SampleMethod(int i) {}
public static void SampleMethod(long l) {}使用后缀 L 可保证调用正确的类型,例如:
复制代码
SampleMethod(5); // Calling the method with the int parameter
SampleMethod(5L); // Calling the method with the long parameter可在同一个表达式中同时使用 long 类型和其他数值整型,这时表达式的计算结果为 long(在关系表达式或布尔表达式中为 bool)类型。例如,下列表达式计算为 long:
复制代码
898L + 88注意
也可用小写字母“l”作后缀。但是,因为字母“l”容易与数字“1”混淆,会生成编译器警告。为清楚起见,请使用“L”。
有关兼用浮点型和整型的算术表达式的信息,请参见 float 和 double。
参考资料来源:搜狗百科--long
参考资料来源:搜狗百科--C语言
3.在C语言中,int类型、long类型、float类型、double类型和char类型数
标准答案:在TC中, 在VC中:类型 宽度 字节 类型 宽度 字节int 16 2 int 32 4unsigned int 16 2 unsigned int 32 4 short 16 2 short 16 2unsigned short 16 2 unsigned short 16 2long 32 4 long 32 4unsigned long 32 4 unsigned long 32 4另外,C语言的浮点数常量在机器中有单精度和双精度之分,单精度以32位形式存放,双精度以64位形式存放。
字符型变量在机器中占8位,也就是1个字节(8 bit=1 byte)。详见下表:类型 宽度 字节 float 32 4 double 64 8 char 8 1。
4.Java中的Long和Double类型
Java中的原子操作包括:1)除long和double之外的基本类型的赋值操作2)所有引用reference的赋值操作3)java.concurrent.Atomic.* 包中所有类的一切操作。
但是java对long和double的赋值操作是非原子操作!!long和double占用的字节数都是8,也就是64bits。在32位操作系统上对64位的数据的读写要分两步完成,每一步取32位数据。
这样对double和long的赋值操作就会有问题:如果有两个线程同时写一个变量内存,一个进程写低32位,而另一个写高32位,这样将导致获取的64位数据是失效的数据。因此需要使用volatile关键字来防止此类现象。
volatile本身不保证获取和设置操作的原子性,仅仅保持修改的可见性。但是java的内存模型保证声明为volatile的long和double变量的get和set操作是原子的。
(from /topic/213794) 举个例子来说:(example is from /questions/17481153/long-and-double-assignments-are-not-atomic-how-does-it-matter) public class UnatomicLong implements Runnable { private static long test = 0; private final long val; public UnatomicLong(long val) { this.val = val; } @Override public void run() { while (!Thread.interrupted()) { test = val; //两个线程都试图将自己的私有变量val赋值给类私有静态变量test } } public static void main(String[] args) { Thread t1 = new Thread(new UnatomicLong(-1)); Thread t2 = new Thread(new UnatomicLong(0)); System.out.println(Long.toBinaryString(-1)); System.out.println(pad(Long.toBinaryString(0), 64)); t1.start(); t2.start(); long val; while ((val = test) == -1 || val == 0) { //如果静态成员test的值是-1或0,说明两个线程操作没有交叉 } System.out.println(pad(Long.toBinaryString(val), 64)); System.out.println(val); t1.interrupt(); t2.interrupt(); }// prepend 0s to the string to make it the target length private static String pad(String s, int targetLength) { int n = targetLength - s.length(); for (int x = 0; x < n; x++) { s = "0" + s; } return s; } }。